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自定义主从分布式架构实例分析
Sep 19 Python
Python MySQLdb 使用utf-8 编码插入中文数据问题
Mar 13 Python
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
Jul 30 Python
python实现在函数中修改变量值的方法
Jul 16 Python
在django admin中添加自定义视图的例子
Jul 26 Python
Python解决pip install时出现的Could not fetch URL问题
Aug 01 Python
Python telnet登陆功能实现代码
Apr 16 Python
tensorflow中tf.reduce_mean函数的使用
Apr 19 Python
python实现飞船大战
Apr 24 Python
简单了解Java Netty Reactor三种线程模型
Apr 26 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
Jan 09 Python
Pytorch中expand()的使用(扩展某个维度)
Jul 15 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
基于mysql的bbs设计(二)
2006/10/09 PHP
php 获取完整url地址
2008/12/20 PHP
谈PHP生成静态页面分析 模板+缓存+写文件
2009/08/17 PHP
深入php数据采集的详解
2013/06/02 PHP
PHP简单遍历对象示例
2016/09/28 PHP
php+webSoket实现聊天室示例代码(附源码)
2017/02/17 PHP
YII2框架中查询生成器Query()的使用方法示例
2020/03/18 PHP
jQuery打印指定区域Html页面并自动分页
2014/07/04 Javascript
javascript中clone对象详解
2014/12/03 Javascript
jQuery仅用3行代码实现的显示与隐藏功能完整实例
2015/10/08 Javascript
JavaScript中的this到底是什么(一)
2015/12/09 Javascript
Active控件问题小结(附解决办法)
2016/06/09 Javascript
JS清除字符串中重复值的实现方法
2016/08/03 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
2017/07/11 Javascript
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
vue-cli 打包后提交到线上出现 "Uncaught SyntaxError:Unexpected token" 报错
2018/11/06 Javascript
vue中引入mxGraph的步骤详解
2019/05/17 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
JS实现字体背景跑马灯
2020/01/06 Javascript
[03:22]DSPL第一期精彩集锦:酷炫到底!
2014/11/07 DOTA
[45:17]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第三场 1月9日
2021/03/11 DOTA
python中PIL安装简单教程
2016/04/21 Python
Python 迭代器工具包【推荐】
2016/05/06 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
详解python中sort排序使用
2019/03/23 Python
钉钉企业内部H5微应用开发详解
2020/05/12 HTML / CSS
大学生应聘求职信
2014/05/26 职场文书
优秀少先队员主要事迹材料
2014/05/28 职场文书
助理政工师申报材料
2014/06/03 职场文书
优秀教师单行材料
2014/12/16 职场文书
学生个人总结范文
2015/02/15 职场文书
2015年学校食堂工作总结
2015/04/22 职场文书
致三级跳运动员加油稿
2015/07/21 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
在 SQL 语句中处理 NULL 值的方法
2021/06/07 SQL Server
十大冰系宝可梦排名,颜值最高的阿罗拉九尾,第三使用率第一
2022/03/18 日漫