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编写简单爬虫资料汇总
Mar 22 Python
Python 快速实现CLI 应用程序的脚手架
Dec 05 Python
django ajax json的实例代码
May 29 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
Jun 22 Python
对python中xlsx,csv以及json文件的相互转化方法详解
Dec 25 Python
python实现一个简单的ping工具方法
Jan 31 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
Apr 29 Python
利用Python小工具实现3秒钟将视频转换为音频
Oct 29 Python
使用IDLE的Python shell窗口实例详解
Nov 19 Python
python实现mean-shift聚类算法
Jun 10 Python
python中slice参数过长的处理方法及实例
Dec 15 Python
教你使用TensorFlow2识别验证码
Jun 11 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实现的递归提成方案实例
2015/11/14 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
2015/12/23 PHP
PHP使用pear实现mail发送功能 windows环境下配置pear
2016/04/15 PHP
JavaScript 权威指南(第四版) 读书笔记
2009/08/11 Javascript
js绑定事件this指向发生改变的问题解决方法
2013/04/23 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
vue-hook-form使用详解
2017/04/07 Javascript
React Native中的RefreshContorl下拉刷新使用
2017/10/09 Javascript
原生JS与jQuery编写简单选项卡
2017/10/30 jQuery
使用async-validator编写Form组件的方法
2018/01/10 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
js+html5实现手机九宫格密码解锁功能
2018/07/30 Javascript
SpringBoot+Vue 前后端合并部署的配置方法
2020/12/30 Vue.js
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
详解Python3.6的py文件打包生成exe
2018/07/13 Python
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
django一对多模型以及如何在前端实现详解
2019/07/24 Python
Python使用lambda表达式对字典排序操作示例
2019/07/25 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
python如何调用字典的key
2020/05/25 Python
Python编写万花尺图案实例
2021/01/03 Python
Python将QQ聊天记录生成词云的示例代码
2021/02/10 Python
CSS3中的弹性布局em运用入门详解 1em等于多少像素
2021/02/08 HTML / CSS
巴西家用小家电购物网站:Polishop
2016/08/07 全球购物
阿迪达斯香港官网:adidas香港
2019/11/09 全球购物
Linux管理员面试经常问道的相关命令
2014/12/12 面试题
物业管理公司实习生自我鉴定
2013/09/19 职场文书
计算机专业毕业生自荐信
2013/12/31 职场文书
2014年外贸业务员工作总结
2014/12/11 职场文书
万能检讨书
2015/01/27 职场文书
2015年转正工作总结范文
2015/04/02 职场文书
超市督导岗位职责
2015/04/10 职场文书
2015年基建工作总结范文
2015/05/23 职场文书
2017大学生寒假社会实践心得体会
2016/01/14 职场文书
Python作用域和名称空间的详细介绍
2022/04/13 Python
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python