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中的闭包详细介绍和实例
Nov 21 Python
Python中使用wxPython开发的一个简易笔记本程序实例
Feb 08 Python
Python中字典映射类型的学习教程
Aug 20 Python
python实现红包裂变算法
Feb 16 Python
Python实现的堆排序算法原理与用法实例分析
Nov 22 Python
使用django-guardian实现django-admin的行级权限控制的方法
Oct 30 Python
Python学习笔记之自定义函数用法详解
Jun 08 Python
django的ORM操作 删除和编辑实现详解
Jul 24 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
Dec 10 Python
pandas读取csv文件提示不存在的解决方法及原因分析
Apr 21 Python
Pygame框架实现飞机大战
Aug 07 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
Oct 16 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
2006/10/09 PHP
无数据库的详细域名查询程序PHP版(4)
2006/10/09 PHP
简介WordPress中用于获取首页和站点链接的PHP函数
2015/12/17 PHP
Windows下php+mysql5.7配置教程
2017/05/16 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
laravel 字段格式化 modle 字段类型转换方法
2019/09/30 PHP
国外大牛IE版本检测!现在IE都到9了,IE检测代码
2012/01/04 Javascript
基于jquery实现的省市区级联无ajax
2013/09/24 Javascript
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
2013/11/07 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
javascript 数组去重复(在线去重工具)
2016/12/17 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
node+vue实现用户注册和头像上传的实例代码
2017/07/20 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
微信小程序支付及退款流程详解
2017/11/30 Javascript
Vue 自定义动态组件实例详解
2018/03/28 Javascript
js实现单元格拖拽效果
2020/02/10 Javascript
[02:35]DOTA2超级联赛专访XB 难忘一年九冠称王
2013/06/20 DOTA
Python编程中字符串和列表的基本知识讲解
2015/10/14 Python
Python使用tablib生成excel文件的简单实现方法
2016/03/16 Python
分析Python读取文件时的路径问题
2018/02/11 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
pycharm 安装JPype的教程
2019/08/08 Python
django连接mysql数据库及建表操作实例详解
2019/12/10 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
荷兰网上鞋店:Ziengs.nl
2017/01/02 全球购物
澳大利亚儿童鞋在线:The Trybe
2019/07/16 全球购物
外贸学院会计专业应届生求职信
2013/11/14 职场文书
学生会主席就职演讲稿
2014/01/14 职场文书
乡镇办公室工作决心书
2014/03/11 职场文书
学生打架检讨书
2014/10/20 职场文书
初中成绩单评语
2014/12/29 职场文书
幼儿园开学报名通知
2015/07/16 职场文书
2016读书月活动心得体会
2016/01/14 职场文书
nginx常用命令放入shell脚本详解
2021/03/31 Servers
CocosCreator入门教程之网络通信
2021/04/16 Javascript