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操作CouchDB数据库简单示例
Mar 10 Python
Python中一些自然语言工具的使用的入门教程
Apr 13 Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
Nov 23 Python
Python实现的knn算法示例
Jun 14 Python
关于windows下Tensorflow和pytorch安装教程
Feb 04 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
Feb 29 Python
Python多线程threading join和守护线程setDeamon原理详解
Mar 18 Python
Python爬虫入门有哪些基础知识点
Jun 02 Python
python GUI计算器的实现
Oct 09 Python
python使用正则表达式匹配txt特定字符串(有换行)
Dec 09 Python
如何用python实现一个HTTP连接池
Jan 14 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中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
2011/03/29 PHP
PHP使用array_multisort对多个数组或多维数组进行排序
2014/12/16 PHP
php结合ACCESS的跨库查询功能
2015/06/12 PHP
codeigniter实现get分页的方法
2015/07/10 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
2016/11/22 PHP
jQuery实现长文字部分显示代码
2013/05/13 Javascript
JS图片根据鼠标滚动延时加载的实例代码
2013/07/13 Javascript
javascript判断两个IP地址是否在同一个网段的实现思路
2013/12/13 Javascript
关于页面嵌入swf覆盖div层的问题的解决方法
2014/02/11 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
2016/02/26 Javascript
JS表格组件神器bootstrap table使用指南详解
2017/04/12 Javascript
bootstrap Table插件使用demo
2017/08/07 Javascript
关于JS模块化的知识点分享
2019/10/16 Javascript
node.js开发辅助工具nodemon安装与配置详解
2020/02/06 Javascript
Cpy和Python的效率对比
2015/03/20 Python
python类和继承用法实例
2015/07/07 Python
详解C++编程中一元运算符的重载
2016/01/19 Python
Python环境下搭建属于自己的pip源的教程
2016/05/05 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
Python获取时间戳代码实例
2019/09/24 Python
Python高级特性——详解多维数组切片(Slice)
2019/11/26 Python
详解CSS3 rem(设置字体大小) 教程
2017/11/21 HTML / CSS
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
C面试题
2015/10/08 面试题
文秘自荐信
2013/10/20 职场文书
会议接待欢迎词
2014/01/12 职场文书
公司任命书模板
2014/06/06 职场文书
旅行社优秀创业计划书
2014/08/16 职场文书
厨师长岗位职责范本
2014/08/25 职场文书
组织生活会表态发言材料
2014/10/17 职场文书
小学一年级学生评语大全
2014/12/25 职场文书
您对思维方式了解多少?
2019/12/09 职场文书
Django模型层实现多表关系创建和多表操作
2021/07/21 Python
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python
SQL Server数据库备份和恢复数据库的全过程
2022/06/14 SQL Server