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 相关文章推荐
在Linux系统上通过uWSGI配置Nginx+Python环境的教程
Dec 25 Python
Python实现Youku视频批量下载功能
Mar 14 Python
python线程池threadpool实现篇
Apr 27 Python
对numpy.append()里的axis的用法详解
Jun 28 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
Jun 26 Python
python用win32gui遍历窗口并设置窗口位置的方法
Jul 26 Python
Django分页功能的实现代码详解
Jul 29 Python
Django实现发送邮件找回密码功能
Aug 12 Python
使用Python进行中文繁简转换的实现代码
Oct 18 Python
Python 支持向量机分类器的实现
Jan 15 Python
django-csrf使用和禁用方式
Mar 13 Python
JupyterNotebook 输出窗口的显示效果调整实现
Sep 22 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
phpBB BBcode处理的漏洞
2006/10/09 PHP
一步一步学习PHP(1) php开发环境配置
2010/02/15 PHP
PHP __autoload()方法真的影响性能吗?
2012/03/30 PHP
php下载excel无法打开的解决方法
2013/12/24 PHP
php实现保存周期为1天的购物车类
2017/07/07 PHP
PHP模版引擎原理、定义与用法实例
2019/03/29 PHP
超级好用的jQuery圆角插件 Corner速成
2014/08/31 Javascript
jquery中JSON的解析方式
2015/03/16 Javascript
JavaScript学习笔记(三):JavaScript也有入口Main函数
2015/09/12 Javascript
JS实现的车标图片提示效果代码
2015/10/10 Javascript
javascript中FOREACH数组方法使用示例
2016/03/01 Javascript
jQuery使用方法
2017/02/04 Javascript
vue.js树形组件之删除双击增加分支实例代码
2017/02/28 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
2018/05/16 jQuery
vue-cli整合vuex的时候,修改actions和mutations,实现热部署的方法
2018/09/19 Javascript
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
Python基于Flask框架配置依赖包信息的项目迁移部署
2018/03/02 Python
python实现决策树、随机森林的简单原理
2018/03/26 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
opencv+python实现均值滤波
2020/02/19 Python
jupyter notebook参数化运行python方式
2020/04/10 Python
python文件路径操作方法总结
2020/12/21 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
英国可持续奢侈品包包品牌:Elvis & Kresse
2018/08/05 全球购物
美国领先的低折扣旅行网站:Hotwire
2019/01/19 全球购物
武汉某公司的C#笔试题面试题
2015/12/25 面试题
教育学习自我评价
2014/02/03 职场文书
信息技术教学反思
2014/02/12 职场文书
大学学雷锋活动总结
2014/06/26 职场文书
团队拓展活动方案
2014/08/28 职场文书
七夕相亲活动策划方案
2014/08/31 职场文书
施工员岗位职责范本
2015/04/11 职场文书
2016关于读书活动的心得体会
2016/01/14 职场文书
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python
Java Shutdown Hook场景使用及源码分析
2021/06/15 Java/Android
GTX1650super好不好 gtx1650super显卡属于什么级别
2022/04/08 数码科技