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 22 Python
Django1.7+python 2.78+pycharm配置mysql数据库
Oct 09 Python
SQLite3中文编码 Python的实现
Jan 11 Python
python装饰器深入学习
Apr 06 Python
python中的变量如何开辟内存
Jun 26 Python
Pytorch中的variable, tensor与numpy相互转化的方法
Oct 10 Python
python单例模式原理与创建方法实例分析
Oct 26 Python
python实现画循环圆
Nov 23 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
Sep 17 Python
python3处理word文档实例分析
Dec 01 Python
如何用python反转图片,视频
Apr 24 Python
Python Pandas读取Excel日期数据的异常处理方法
Feb 28 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查询数据库中满足条件的记录条数(两种实现方法)
2013/01/29 PHP
PHP中预定义的6种接口介绍
2015/05/12 PHP
PHP获取远程图片并保存到本地的方法
2015/05/12 PHP
PHP函数func_num_args用法实例分析
2015/12/07 PHP
php自定义排序uasort函数示例【二维数组按指定键值排序】
2019/06/19 PHP
游戏人文件夹程序 ver 3.0
2006/07/14 Javascript
Chosen 基于jquery的选择框插件使用方法
2012/05/30 Javascript
javascript确认框的三种使用方法
2013/12/17 Javascript
浅析jquery的js图表组件highcharts
2014/03/06 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
javascript中获取元素标签中间的内容的实现方法
2016/10/08 Javascript
JS实现的简单标签点击切换功能示例
2017/09/21 Javascript
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
2017/09/28 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
2017/10/20 Javascript
详解vue 计算属性与方法跟侦听器区别(面试考点)
2018/04/23 Javascript
JS实现HTML页面中动态显示当前时间完整示例
2018/07/30 Javascript
vue实现五子棋游戏
2020/05/28 Javascript
Python构建XML树结构的方法示例
2017/06/30 Python
python: line=f.readlines()消除line中\n的方法
2018/03/19 Python
详解Django之admin组件的使用和源码剖析
2018/05/04 Python
Python UnboundLocalError和NameError错误根源案例解析
2018/10/31 Python
python 定时任务去检测服务器端口是否通的实例
2019/01/26 Python
python实现一个点绕另一个点旋转后的坐标
2019/12/04 Python
Python实现微信好友的数据分析
2019/12/16 Python
修改Pandas的行或列的名字(重命名)
2019/12/18 Python
python爬虫搭配起Bilibili唧唧的流程分析
2020/12/01 Python
Python如何实现感知器的逻辑电路
2020/12/25 Python
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
《三顾茅庐》教学反思
2014/04/10 职场文书
商务英语专业毕业生求职信
2014/07/06 职场文书
报到证办理个人委托书
2014/10/06 职场文书
民主生活会汇报材料
2014/12/15 职场文书
2016银行招聘自荐信
2016/01/28 职场文书
python自动计算图像数据集的RGB均值
2021/06/18 Python