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实现实例
Apr 26 Python
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
Jun 18 Python
python使用PIL缩放网络图片并保存的方法
Apr 24 Python
小米5s微信跳一跳小程序python源码
Jan 08 Python
pycharm+django创建一个搜索网页实例代码
Jan 24 Python
python实现批量修改图片格式和尺寸
Jun 07 Python
Python实现的列表排序、反转操作示例
Mar 13 Python
python中class的定义及使用教程
Sep 18 Python
python3实现弹弹球小游戏
Nov 25 Python
基于Tensorflow:CPU性能分析
Feb 10 Python
python数据爬下来保存的位置
Feb 17 Python
Python基于gevent实现文件字符串查找器
Aug 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和AJAX创建RSS聚合器的代码
2007/03/13 PHP
在字符串指定位置插入一段字符串的php代码
2010/02/16 PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
2015/11/30 PHP
JavaScript 模仿vbs中的 DateAdd() 函数的代码
2007/08/13 Javascript
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
2010/03/14 Javascript
避免 showModalDialog 弹出新窗体的原因分析
2010/05/31 Javascript
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
JQuery将文本转化成JSON对象需要注意的问题
2011/05/09 Javascript
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
2016/05/05 Javascript
canvas的神奇用法
2017/02/03 Javascript
jQuery为DOM动态追加事件的方法
2017/02/16 Javascript
JS实现点击链接切换显示隐藏内容的方法
2017/10/19 Javascript
详解Nuxt.js部署及踩过的坑
2018/08/07 Javascript
解决vue.js 数据渲染成功仍报错的问题
2018/08/25 Javascript
vue2.0自定义指令示例代码详解
2019/04/25 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
2020/07/19 Javascript
python实现监控linux性能及进程消耗性能的方法
2014/07/25 Python
Python单元测试框架unittest使用方法讲解
2015/04/13 Python
python模拟enum枚举类型的方法小结
2015/04/30 Python
Python3访问并下载网页内容的方法
2015/07/28 Python
Python可迭代对象操作示例
2019/05/07 Python
Python 寻找局部最高点的实现
2019/12/05 Python
Selenium关闭INFO:CONSOLE提示的解决
2020/12/07 Python
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
英国户外玩具儿童游乐设备网站:TP Toys(蹦床、攀爬框架、秋千、滑梯和游戏屋)
2018/04/09 全球购物
罗兰·穆雷官网:Roland Mouret
2018/09/28 全球购物
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
上海微创软件面试题
2012/06/14 面试题
2014年党员自我评议对照检查材料
2014/09/20 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
交警失职检讨书
2015/01/26 职场文书
求职信内容一般写什么?
2015/03/20 职场文书
学校禁毒宣传活动总结
2015/05/08 职场文书
pytorch DataLoader的num_workers参数与设置大小详解
2021/05/28 Python
nginx rewrite功能使用场景分析
2022/05/30 Servers