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基础教程之缩进介绍
Aug 29 Python
Python的subprocess模块总结
Nov 07 Python
Python实现的求解最小公倍数算法示例
May 03 Python
Python创建普通菜单示例【基于win32ui模块】
May 09 Python
Python通过paramiko远程下载Linux服务器上的文件实例
Dec 27 Python
python实现蒙特卡罗方法教程
Jan 28 Python
Python函数的默认参数设计示例详解
Dec 01 Python
Python MySQLdb 执行sql语句时的参数传递方式
Mar 04 Python
PyQt5 QDockWidget控件应用详解
Aug 12 Python
Django中和时区相关的安全问题详解
Oct 12 Python
python中openpyxl和xlsxwriter对Excel的操作方法
Mar 01 Python
python实现调用摄像头并拍照发邮箱
Apr 27 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面试题(对属性或方法的访问控制)
2012/09/13 PHP
自己写的兼容低于PHP 5.5版本的array_column()函数
2014/10/24 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
2015/06/24 PHP
PHP最常用的正则表达式
2017/02/13 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
PHP安全之register_globals的on和off的区别
2020/07/23 PHP
JavaScript 学习笔记(十五)
2010/01/28 Javascript
javascript 传统事件模型构造的事件监听器实现代码
2010/05/31 Javascript
Firefox下无法正常显示年份的解决方法
2014/09/04 Javascript
jQuery垂直多级导航菜单代码分享
2015/08/18 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
jQuery判断浏览器并动态调整select宽度的方法
2016/03/02 Javascript
js中最容易被忽视的事件问题大总结
2016/05/15 Javascript
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
2018/05/10 Javascript
React如何解决fetch跨域请求时session失效问题
2018/11/02 Javascript
JavaScript多种页面刷新方法小结
2019/04/04 Javascript
vue实现todolist功能、todolist组件拆分及todolist的删除功能
2019/04/11 Javascript
微信小程序-form表单提交代码实例
2019/04/29 Javascript
vue开发中遇到的问题总结
2020/04/07 Javascript
python遍历文件夹并删除特定格式文件的示例
2014/03/05 Python
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
2014/11/18 Python
Python模块文件结构代码详解
2018/02/03 Python
对python调用RPC接口的实例详解
2019/01/03 Python
Python Flask 搭建微信小程序后台详解
2019/05/06 Python
Python安装及Pycharm安装使用教程图解
2019/09/20 Python
tensorflow保持每次训练结果一致的简单实现
2020/02/17 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
2020/12/09 Python
Application Cache未缓存文件无法访问无法加载问题
2014/05/31 HTML / CSS
科颜氏加拿大官方网站: Kiehl’s加拿大
2016/08/16 全球购物
西班牙最大的在线滑板和街头服饰商店:Fillow.net
2019/04/15 全球购物
公司出纳岗位职责
2013/12/07 职场文书
《蜗牛》教学反思
2014/02/18 职场文书
2015年度企业工作总结
2015/05/21 职场文书
2019年怎样才能撰写出优秀的自荐信
2019/03/25 职场文书
使用scrapy实现增量式爬取方式
2022/06/21 Python