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获取单个程序CPU使用情况趋势图
Mar 10 Python
Python 实现 贪吃蛇大作战 代码分享
Sep 07 Python
轻松掌握python设计模式之访问者模式
Nov 18 Python
Python django实现简单的邮件系统发送邮件功能
Jul 14 Python
Python下载网络文本数据到本地内存的四种实现方法示例
Feb 05 Python
基于anaconda下强大的conda命令介绍
Jun 11 Python
django和vue实现数据交互的方法
Aug 21 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
Nov 04 Python
Python Selenium参数配置方法解析
Jan 19 Python
解决Pycharm 导入其他文件夹源码的2种方法
Feb 12 Python
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
May 17 Python
Python Django模型详解
Oct 05 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操作数组相关函数
2011/02/03 PHP
表格展示无限级分类(PHP版)
2012/08/21 PHP
PHP+Ajax实现的博客文章添加类别功能示例
2018/03/29 PHP
PHP实现数组和对象的相互转换操作示例
2019/03/20 PHP
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
javascript 显示当前系统时间代码
2009/12/28 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
2016/05/10 Javascript
基于jquery插件实现拖拽删除图片功能
2020/08/27 Javascript
全面了解JavaScript对象进阶
2016/07/19 Javascript
jQuery EasyUI中的日期控件DateBox修改方法
2016/11/09 Javascript
微信禁止下拉查看URL的处理方法
2017/09/28 Javascript
webstorm+vue初始化项目的方法
2018/10/18 Javascript
详解在React项目中安装并使用Less(用法总结)
2019/03/18 Javascript
详解ES6 export default 和 import语句中的解构赋值
2019/05/28 Javascript
Vue指令之 v-cloak、v-text、v-html实例详解
2019/08/08 Javascript
微信小程序tab切换可滑动切换导航栏跟随滚动实现代码
2019/09/04 Javascript
Nodejs 微信小程序消息推送的实现
2021/01/20 NodeJs
Python实现多线程下载文件的代码实例
2014/06/01 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
python使用minimax算法实现五子棋
2019/07/29 Python
Python Django form 组件动态从数据库取choices数据实例
2020/05/19 Python
基于python实现ROC曲线绘制广场解析
2020/06/28 Python
利用python绘制中国地图(含省界、河流等)
2020/09/21 Python
详解Python GUI编程之PyQt5入门到实战
2020/12/10 Python
澳大利亚旅游网站:Lastminute
2017/08/07 全球购物
HSRP的含义以及如何工作
2014/09/10 面试题
继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
2015/11/18 面试题
预备党员思想汇报
2014/01/08 职场文书
校园广播稿精选
2014/10/01 职场文书
经营目标责任书
2015/05/08 职场文书
担保书怎么写 ?
2019/04/22 职场文书
详解Node.js如何处理ES6模块
2021/05/15 Javascript
Nginx中使用Lua脚本与图片的缩略图处理的实现
2022/03/18 Servers
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis