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代码真的很爽
Aug 26 Python
基于Python实现的扫雷游戏实例代码
Aug 01 Python
Python中常见的数据类型小结
Aug 29 Python
python编程实现归并排序
Apr 14 Python
Python复数属性和方法运算操作示例
Jul 21 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
May 27 Python
8种用Python实现线性回归的方法对比详解
Jul 10 Python
Python分割训练集和测试集的方法示例
Sep 19 Python
git查看、创建、删除、本地、远程分支方法详解
Feb 18 Python
OpenCV Python实现图像指定区域裁剪
Mar 12 Python
scrapy中如何设置应用cookies的方法(3种)
Sep 22 Python
利用python做数据拟合详情
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
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
使用ob系列函数实现PHP网站页面静态化
2014/08/13 PHP
PHP简单的MVC框架实现方法
2015/12/01 PHP
thinkphp3.x中display方法及show方法的用法实例
2016/05/19 PHP
实现连缀调用的map方法(prototype)
2009/08/05 Javascript
jQuery操作Select的Option上下移动及移除添加等等
2013/11/18 Javascript
js style动态设置table高度
2014/10/21 Javascript
浅谈javascript中的闭包
2015/05/13 Javascript
js计算系统当前日期是星期几的方法
2016/07/14 Javascript
移动设备手势事件库Touch.js使用详解
2017/08/18 Javascript
Js经典案例的实例代码
2018/05/10 Javascript
vue-cli2 构建速度优化的实现方法
2019/01/08 Javascript
vue实现form表单与table表格的数据关联功能示例
2019/01/29 Javascript
js数组中去除重复值的几种方法
2020/08/03 Javascript
[02:20]DOTA2亚洲邀请赛 EHOME战队出场宣传片
2015/02/07 DOTA
[00:26]TI7不朽珍藏III——冥界亚龙不朽展示
2017/07/15 DOTA
详解Python中列表和元祖的使用方法
2015/04/25 Python
浅谈Python由__dict__和dir()引发的一些思考
2017/10/30 Python
Python实现base64编码的图片保存到本地功能示例
2018/06/22 Python
使用PYTHON解析Wireshark的PCAP文件方法
2019/07/23 Python
python tkinter实现彩球碰撞屏保
2019/07/30 Python
python 3.6.7实现端口扫描器
2019/09/04 Python
python几种常用功能实现代码实例
2019/12/25 Python
在Tensorflow中实现leakyRelu操作详解(高效)
2020/06/30 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
如何用python开发Zeroc Ice应用
2021/01/29 Python
Html5百叶窗效果的示例代码
2017/12/11 HTML / CSS
在网上学习全世界最好的课程:Coursera
2017/11/07 全球购物
西班牙太阳镜品牌:Hawkers
2018/03/11 全球购物
工商管理专业职业生涯规划
2014/01/01 职场文书
职业规划实施方案
2014/06/10 职场文书
学生逃课检讨书1000字
2014/10/20 职场文书
活动费用申请报告
2015/05/15 职场文书
校运会加油稿大全
2015/07/22 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL
Nginx源码编译安装过程记录
2021/11/17 Servers