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 相关文章推荐
KMP算法精解及其Python版的代码示例
Jun 01 Python
详解python3实现的web端json通信协议
Dec 29 Python
用python写一个windows下的定时关机脚本(推荐)
Mar 21 Python
Python学习pygal绘制线图代码分享
Dec 09 Python
Python堆排序原理与实现方法详解
May 11 Python
python 3调用百度OCR API实现剪贴板文字识别
Sep 04 Python
python-opencv 将连续图片写成视频格式的方法
Jan 08 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
Jan 22 Python
python 已知平行四边形三个点,求第四个点的案例
Apr 12 Python
如何在mac下配置python虚拟环境
Jul 06 Python
Python基于Faker假数据构造库
Nov 30 Python
用Python实现职工信息管理系统
Dec 30 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
基于curl数据采集之单页面采集函数get_html的使用
2013/04/28 PHP
php实现的验证码文件类实例
2015/06/18 PHP
ajax+php控制所有后台函数调用
2015/07/15 PHP
php实现的二分查找算法示例
2017/06/20 PHP
围观tangram js库
2010/12/28 Javascript
js实现人民币大写金额形式转换
2016/04/27 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
JavaScript使用delete删除数组元素用法示例【数组长度不变】
2017/01/17 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
使用 Vue 绑定单个或多个 Class 名的实例代码
2018/01/08 Javascript
基于Vue-cli快速搭建项目的完整步骤
2018/11/03 Javascript
ES6中的迭代器、Generator函数及Generator函数的异步操作方法
2019/05/12 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
2019/09/29 Javascript
解决echarts 一条柱状图显示两个值,类似进度条的问题
2020/07/20 Javascript
vue打包npm run build时候界面报错的解决
2020/08/13 Javascript
初步理解Python进程的信号通讯
2015/04/09 Python
Python2.x利用commands模块执行Linux shell命令
2016/03/11 Python
Python Socket实现简单TCP Server/client功能示例
2017/08/05 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
如何在Python对Excel进行读取
2020/06/04 Python
css3 按钮 利用css3实现超酷下载按钮
2013/03/18 HTML / CSS
div或img图片高度随宽度自适应的方法
2020/02/06 HTML / CSS
荷兰本土平价百货:HEMA
2017/10/23 全球购物
Nordgreen手表德国官方网站:丹麦极简主义手表
2019/10/31 全球购物
思想品德自我鉴定
2013/10/12 职场文书
演讲比赛获奖感言
2014/02/02 职场文书
《少年王冕》教学反思
2014/04/11 职场文书
人事经理岗位职责范本
2014/08/04 职场文书
教师演讲稿开场白
2014/08/25 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
安全保证书怎么写
2015/02/28 职场文书
离婚起诉书范本
2015/05/18 职场文书
Vue+Element UI实现概要小弹窗的全过程
2021/05/30 Vue.js
Python Pygame实战在打砖块游戏的实现
2022/03/17 Python
微信告警的zabbix监控系统 监控整个NGINX集群
2022/04/18 Servers
Windows Server 2016服务器用户管理及远程授权图文教程
2022/08/14 Servers