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网络爬虫采集联想词示例
Feb 11 Python
python中使用OpenCV进行人脸检测的例子
Apr 18 Python
Python中处理字符串之endswith()方法的使用简介
May 18 Python
举例详解Python中threading模块的几个常用方法
Jun 18 Python
python基本语法练习实例
Sep 19 Python
分析Python中解析构建数据知识
Jan 20 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
Jun 13 Python
Python 用三行代码提取PDF表格数据
Oct 13 Python
什么是Python中的匿名函数
Jun 02 Python
Pycharm编辑器功能之代码折叠效果的实现代码
Oct 15 Python
pycharm中leetcode插件使用图文详解
Dec 07 Python
Python创建SQL数据库流程逐步讲解
Sep 23 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字符转义相关函数小结(php下的转义字符串)
2007/04/12 PHP
PHP编码规范之注释和文件结构说明
2010/07/09 PHP
10款实用的PHP开源工具
2015/10/23 PHP
详解Yii2高级版引入bootstrap.js的一个办法
2017/03/21 PHP
jQuery1.6 正式版发布并提供下载
2011/05/05 Javascript
Javascript 类、命名空间、代码组织代码
2011/07/31 Javascript
jQuery拖动图片删除示例
2013/05/10 Javascript
jquery禁止回车触发表单提交
2014/12/12 Javascript
javascript获取元素离文档各边距离的方法
2015/02/13 Javascript
简介JavaScript中的getUTCFullYear()方法的使用
2015/06/10 Javascript
Jquery实现顶部弹出框特效
2015/08/08 Javascript
nodejs创建web服务器之hello world程序
2015/08/20 NodeJs
js评分组件使用详解
2017/06/06 Javascript
vue2.0的contextmenu右键弹出菜单的实例代码
2017/07/24 Javascript
Vue实现内部组件轮播切换效果的示例代码
2018/04/07 Javascript
vue-cli 打包使用history模式的后端配置实例
2018/09/20 Javascript
vue-router传参用法详解
2019/01/19 Javascript
axios+Vue实现上传文件显示进度功能
2019/04/14 Javascript
详解NodeJs项目 CentOs linux服务器线上部署
2019/09/16 NodeJs
[01:43]3.19DOTA2发布会 三代刀塔人第三代
2014/03/25 DOTA
[50:58]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 Mineski vs EG
2018/04/03 DOTA
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
2018/04/02 Python
Python selenium实现微博自动登录的示例代码
2018/05/16 Python
把csv文件转化为数组及数组的切片方法
2018/07/04 Python
Python 实现一个手机号码获取妹子名字的功能
2019/09/25 Python
Python多线程及其基本使用方法实例分析
2019/10/29 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
2020/02/11 Python
求职者简历中的自我评价
2013/10/20 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
2014年体检中心工作总结
2014/12/23 职场文书
财务个人年度总结范文
2015/02/26 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书
Python - 10行代码集2000张美女图
2021/05/23 Python
最新动漫情报:2022年7月新番定档超过30部, OVERLORD骨王第四季也在其中噢
2022/05/04 日漫