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和shell实现的校验IP地址合法性脚本分享
Oct 23 Python
Python脚本实现格式化css文件
Apr 08 Python
通过Python使用saltstack生成服务器资产清单
Mar 01 Python
python用户评论标签匹配的解决方法
May 31 Python
Python sorted函数详解(高级篇)
Sep 18 Python
PySide和PyQt加载ui文件的两种方法
Feb 27 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
Mar 13 Python
Python实现微信消息防撤回功能的实例代码
Apr 29 Python
Python之变量类型和if判断方式
May 05 Python
keras实现基于孪生网络的图片相似度计算方式
Jun 11 Python
python入门教程之基本算术运算符
Nov 13 Python
python time.strptime格式化实例详解
Feb 03 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
使用apache模块rewrite_module (转)
2007/02/14 PHP
PHP 计算代码执行耗时的代码修正网上普遍错误
2011/05/14 PHP
php获得url参数中具有&的值的方法
2014/03/05 PHP
百度地图API应用之获取用户的具体位置
2014/06/10 PHP
PHP/ThinkPHP实现批量打包下载文件的方法示例
2017/07/31 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
基于jQuery的仿flash的广告轮播代码
2010/11/04 Javascript
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
2012/02/03 Javascript
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
2012/06/18 Javascript
js防止表单重复提交实现代码
2012/09/05 Javascript
JavaScript中setAttribute用法介绍
2013/07/20 Javascript
Javascript中的方法和匿名方法实例详解
2015/06/13 Javascript
JS+CSS相对定位实现的下拉菜单
2015/10/06 Javascript
JS iFrame加载慢怎么解决
2016/05/13 Javascript
浅谈js在html中的加载执行顺序,多个jquery ready执行顺序
2016/11/26 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
JS实现标签滚动切换效果
2017/12/25 Javascript
vuex 使用文档小结篇
2018/01/11 Javascript
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
ES7之Async/await的使用详解
2019/03/28 Javascript
[01:15]《辉夜杯》北京网鱼队巡礼
2015/10/26 DOTA
[02:12]Dota 2 推出全新英雄—— 电炎绝手
2019/08/23 DOTA
Python构建图像分类识别器的方法
2019/01/12 Python
Python实现剪刀石头布小游戏(与电脑对战)
2019/12/31 Python
python中watchdog文件监控与检测上传功能
2020/10/30 Python
HTML5 在canvas中绘制文本附效果图
2014/06/23 HTML / CSS
Joie官方网上商店:购买服装和女装配饰
2018/06/05 全球购物
Bailey帽子官方商店:Bailey Hats
2018/09/25 全球购物
人事部岗位职责范本
2014/03/05 职场文书
公休请假条
2014/04/11 职场文书
厨师个人自我鉴定范文
2014/04/19 职场文书
中学学校门卫岗位职责
2014/08/15 职场文书
四风问题自查自纠工作情况报告
2014/10/28 职场文书
浅谈如何写好演讲稿?
2019/06/12 职场文书
浅谈Python numpy创建空数组的问题
2021/05/25 Python
javascript函数式编程基础
2021/09/15 Javascript