python self,cls,decorator的理解


Posted in Python onJuly 13, 2009

1. self, cls 不是关键字
在python里面,self, cls 不是关键字,完全可以使用自己写的任意变量代替实现一样的效果
代码1

class MyTest: 
myname = 'peter' 
def sayhello(hello): 
print "say hello to %s" % hello.myname if __name__ == "__main__": 
MyTest().sayhello()

代码1中, 用hello代替掉了self, 得到的是一样的效果,也可以替换成java中常用的this.
结论 : self和cls只是python中约定的写法,本质上只是一个函数参数而已,没有特别含义。
任何对象调用方法都会把把自己作为该方法中的第一个参数,传递到函数中。(因为在python中万物都是对象,所以当我们使用Class.method()的时候,实际上的第一个参数是我们约定的cls)
2. 类的定义可以动态修改
代码2
class MyTest: 
myname = 'peter' 
def sayhello(self): 
print "say hello to %s" % self.myname if __name__ == "__main__": 
MyTest.myname = 'hone' 
MyTest.sayhello = lambda self,name: "I want say hello to %s" % name 
MyTest.saygoodbye = lambda self,name: "I do not want say goodbye to %s" % name 
print MyTest().sayhello(MyTest.myname) 
print MyTest().saygoodbye(MyTest.myname)

这里修改了MyTest类中的变量和函数定义, 实例化的instance有了不同的行为特征。
3. decorator
decorator是一个函数, 接收一个函数作为参数, 返回值是一个函数
代码3
def enhanced(meth): 
def new(self, y): 
print "I am enhanced" 
return meth(self, y) 
return new 
class C: 
def bar(self, x): 
print "some method says:", x 
bar = enhanced(bar)

上面是一个比较典型的应用
以常用的@classmethod为例
正常的使用方法是
代码4
class C: 
@classmethod 
def foo(cls, y): 
print "classmethod", cls, y

这里有个疑惑的地方,不是很明白: 如果一个方法没有使用@classmethod, 那么用Class.method()的方式,是会报错的。但是@classmethod是个decorator, 那么它返回的也是一个函数,为什么这样就可以直接被Class调用了呢?
Python 相关文章推荐
python小技巧之批量抓取美女图片
Jun 06 Python
python实现多线程采集的2个代码例子
Jul 07 Python
Python实现合并字典的方法
Jul 07 Python
numpy中索引和切片详解
Dec 15 Python
Python3处理HTTP请求的实例
May 10 Python
python使用RNN实现文本分类
May 24 Python
python基础学习之如何对元组各个元素进行命名详解
Jul 12 Python
Python分割训练集和测试集的方法示例
Sep 19 Python
Pytorch maxpool的ceil_mode用法
Feb 18 Python
python计算Content-MD5并获取文件的Content-MD5值方式
Apr 03 Python
如何用 Python 处理不平衡数据集
Jan 04 Python
Python Matplotlib库实现画局部图
Nov 17 Python
python 解析html之BeautifulSoup
Jul 07 #Python
打印出python 当前全局变量和入口参数的所有属性
Jul 01 #Python
python 查找文件夹下所有文件 实现代码
Jul 01 #Python
python 运算符 供重载参考
Jun 11 #Python
python getopt 参数处理小示例
Jun 09 #Python
用python分割TXT文件成4K的TXT文件
May 23 #Python
python 正则式 概述及常用字符
May 07 #Python
You might like
php使用imagick模块实现图片缩放、裁剪、压缩示例
2014/04/17 PHP
简单谈谈 php 文件锁
2017/02/19 PHP
javascript 操作cookies及正确使用cookies的属性
2009/10/15 Javascript
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
JQuery中html()方法使用不当带来的陷阱
2011/04/07 Javascript
Javascript图像处理—平滑处理实现原理
2012/12/28 Javascript
Json字符串转换为JS对象的高效方法实例
2013/05/01 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
浏览器图片选择预览、旋转、批量上传的JS代码实现
2013/12/04 Javascript
jQuery中after()方法用法实例
2014/12/25 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
将页面table内容与样式另存成excel文件的方法
2015/08/05 Javascript
bootstrap模态框跳转到当前模板页面 框消失了而背景存在问题的解决方法
2020/11/30 Javascript
js 动态生成html 触发事件传参字符转义的实例
2017/02/14 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
jQuery复合事件用法示例
2017/06/10 jQuery
基于vue+echarts 数据可视化大屏展示的方法示例
2020/03/09 Javascript
微信小程序实现抖音播放效果的实例代码
2020/04/11 Javascript
Javascript异步流程控制之串行执行详解
2020/09/27 Javascript
微信小程序实现多张图片上传功能
2020/11/18 Javascript
Python遍历文件夹和读写文件的实现方法
2017/05/10 Python
代码讲解Python对Windows服务进行监控
2018/02/11 Python
python数字图像处理之高级形态学处理
2018/04/27 Python
利用Python如何制作好玩的GIF动图详解
2018/07/11 Python
Python将字符串常量转化为变量方法总结
2019/03/17 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
seek引发的python文件读写的问题及解决
2019/07/26 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
2019/08/06 Python
Python headers请求头如何实现快速添加
2020/11/03 Python
通信工程专业个人找工作求职信范文
2013/09/21 职场文书
2014三八妇女节活动总结范文四篇
2014/03/09 职场文书
贷款委托书范本
2014/04/08 职场文书
房屋出租协议书
2014/04/10 职场文书
高中美术教师事迹材料
2014/08/22 职场文书
工地材料员岗位职责
2015/04/11 职场文书
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS