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使用reportlab将目录下所有的文本文件打印成pdf的方法
May 20 Python
在centos7中分布式部署pyspider
May 03 Python
Python实现随机生成有效手机号码及身份证功能示例
Jun 05 Python
TensorFlow平台下Python实现神经网络
Mar 10 Python
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
Sep 13 Python
Django文件存储 默认存储系统解析
Aug 02 Python
Python绘制股票移动均线的实例
Aug 24 Python
Python实现结构体代码实例
Feb 10 Python
python GUI库图形界面开发之PyQt5窗口类QMainWindow详细使用方法
Feb 26 Python
python3用urllib抓取贴吧邮箱和QQ实例
Mar 10 Python
Python 字典一个键对应多个值的方法
Sep 29 Python
python数字图像处理数据类型及颜色空间转换
Jun 28 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调用Twitter的RSS的实现代码
2010/03/10 PHP
PHP UTF8中文字符截断函数代码
2012/09/11 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
2013/08/08 PHP
php获取域名的google收录示例
2014/03/24 PHP
php中文字符串截取方法实例总结
2014/09/30 PHP
php中header设置常见文件类型的content-type
2015/06/23 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
小议Javascript中的this指针
2010/03/18 Javascript
JS删除数组元素的函数介绍
2013/03/27 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
javascript刷新父页面的各种方法汇总
2014/09/03 Javascript
IE及IE6浏览器中判断JS文件加载成功失败的方法
2015/02/18 Javascript
javascript实现Table间隔色以及选择高亮(和动态切换数据)的方法
2015/05/14 Javascript
jQuery post数据至ashx实例详解
2016/11/18 Javascript
微信小程序分页加载的实例代码
2017/07/11 Javascript
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
Angular 作用域scope的具体使用
2017/12/11 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
详解JWT token心得与使用实例
2019/08/02 Javascript
python使用pil生成图片验证码的方法
2015/05/08 Python
python使用PyGame模块播放声音的方法
2015/05/20 Python
python实现在字符串中查找子字符串的方法
2015/07/11 Python
Python OpenCV 使用滑动条来调整函数参数的方法
2019/07/08 Python
Python autoescape标签用法解析
2020/01/17 Python
如何实现更换Jupyter Notebook内核Python版本
2020/05/18 Python
使用Keras 实现查看model weights .h5 文件的内容
2020/06/09 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
2014/06/23 HTML / CSS
Crabtree & Evelyn欧盟:豪华洗浴、身体和护发
2021/03/09 全球购物
法学个人求职信范文
2014/01/27 职场文书
教育技术职业规划范文
2014/03/04 职场文书
会计学专业求职信
2014/07/17 职场文书
弘扬焦裕禄精神走群众路线思想汇报
2014/09/12 职场文书
作风整顿个人剖析材料
2014/10/06 职场文书
大雁塔导游词
2015/02/04 职场文书