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之有点简约的元组
Sep 24 Python
在Python程序中操作文件之isatty()方法的使用教程
May 24 Python
django rest framework之请求与响应(详解)
Nov 06 Python
Python使用matplotlib简单绘图示例
Feb 01 Python
python 通过xml获取测试节点和属性的实例
Mar 31 Python
用python处理图片实现图像中的像素访问
May 04 Python
python实现将一个数组逆序输出的方法
Jun 25 Python
解决pyttsx3无法封装的问题
Dec 24 Python
对Python的多进程锁的使用方法详解
Feb 18 Python
Django ORM实现按天获取数据去重求和例子
May 18 Python
Python实现AES加密,解密的两种方法
Oct 03 Python
Python使用random模块实现掷骰子游戏的示例代码
Apr 29 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
mysql 字段类型说明
2007/04/27 PHP
php实现的mongodb操作类
2015/05/28 PHP
php+ajax 实现输入读取数据库显示匹配信息
2015/10/08 PHP
CI(CodeIgniter)框架实现图片上传的方法
2017/03/24 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
laravel admin实现分类树/模型树的示例代码
2020/06/10 PHP
juqery 学习之四 筛选查找
2010/11/30 Javascript
理解JavaScript的prototype属性
2012/02/11 Javascript
jquery toolbar与网页浮动工具条具体实现代码
2014/01/12 Javascript
js style动态设置table高度
2014/10/21 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
JavaScript知识点总结(四)之逻辑OR运算符详解
2016/05/31 Javascript
vuex实现简易计数器
2016/10/27 Javascript
详解微信小程序 wx.uploadFile 的编码坑
2017/01/23 Javascript
vue如何实现observer和watcher源码解析
2017/03/09 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
浅谈JavaScript 代码整洁之道
2018/10/23 Javascript
javascript使用substring实现的展开与收缩文字功能示例
2019/06/17 Javascript
python实现媒体播放器功能
2018/02/11 Python
Python pyinotify模块实现对文档的实时监控功能方法
2018/10/13 Python
python实现银联支付和支付宝支付接入
2019/05/07 Python
python创建学生管理系统
2019/11/22 Python
基于python求两个列表的并集.交集.差集
2020/02/10 Python
python包的导入方式总结
2021/03/02 Python
美国卡车、吉普车和SUV零件网站:4 Wheel Parts
2016/11/24 全球购物
精选干货:Java精选笔试题附答案
2014/01/18 面试题
吸烟检讨书2000字
2014/02/13 职场文书
建议书怎么写
2014/03/12 职场文书
团队拓展活动方案
2014/08/28 职场文书
四查四看整改措施
2014/09/19 职场文书
走群众路线剖析材料
2014/10/09 职场文书
2014年外贸业务员工作总结
2014/12/11 职场文书
传单、海报早OUT了,另类传单营销方案送给你!
2019/07/15 职场文书
Python机器学习实战之k-近邻算法的实现
2021/11/27 Python
Spring Security动态权限的实现方法详解
2022/06/16 Java/Android
win10重装系统后上不了网怎么办 win10重装系统网络故障的解决办法
2022/07/23 数码科技