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基础之getpass模块详细介绍
Aug 10 Python
Python反射用法实例简析
Dec 22 Python
Python实现将doc转化pdf格式文档的方法
Jan 19 Python
python生成lmdb格式的文件实例
Nov 08 Python
python装饰器原理与用法深入详解
Dec 19 Python
python itsdangerous模块的具体使用方法
Feb 17 Python
tensorflow2.0的函数签名与图结构(推荐)
Apr 28 Python
django 实现后台从富文本提取纯文本
Jul 02 Python
python 根据列表批量下载网易云音乐的免费音乐
Dec 03 Python
Python字节单位转换(将字节转换为K M G T)
Mar 02 Python
怎么用Python识别手势数字
Jun 07 Python
python通过新建环境安装tfx的问题
May 20 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或asp创建网页桌面快捷方式的代码
2010/03/23 PHP
PHP中用接口、抽象类、普通基类实现“面向接口编程”与“耦合方法”简述
2011/03/23 PHP
linux下为php添加curl扩展的方法
2011/07/29 PHP
php面试中关于面向对象的相关问题
2019/02/13 PHP
kmock javascript 单元测试代码
2011/02/06 Javascript
jQuery Form 页面表单提交的小例子
2013/11/15 Javascript
绑定回车enter事件代码
2014/05/18 Javascript
jquery 表格排序、实时搜索表格内容(附图)
2014/05/19 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
jQuery操作DOM之获取表单控件的值
2015/01/23 Javascript
JavaScript插件化开发教程(五)
2015/02/01 Javascript
原生Js实现简易烟花爆炸效果的方法
2015/03/20 Javascript
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
angular+bootstrap的双向数据绑定实例
2017/03/03 Javascript
原生JS实现图片网格式渐显、渐隐效果
2017/06/05 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
jQuery实现飞机大战小游戏
2020/07/05 jQuery
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
Vue ​v-model相关知识总结
2021/01/28 Vue.js
tornado框架blog模块分析与使用
2013/11/21 Python
python文件操作整理汇总
2014/10/21 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
2018/06/27 Python
python安装twisted的问题解析
2018/08/21 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
2019/06/24 Python
django使用haystack调用Elasticsearch实现索引搜索
2019/07/24 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
2019/12/10 Python
python实现FTP文件传输的方法(服务器端和客户端)
2020/03/20 Python
python3.7添加dlib模块的方法
2020/07/01 Python
Html5 canvas画图白板踩坑
2020/06/01 HTML / CSS
Osklen官方在线商店:巴西服装品牌
2019/04/25 全球购物
电力公司个人求职信范文
2014/02/04 职场文书
医院见习报告范文
2014/11/03 职场文书
建筑安全员岗位职责
2015/02/15 职场文书
2015年健康教育工作总结
2015/04/10 职场文书
Java Socket实现多人聊天系统
2021/07/15 Java/Android