pythonself:python self cls decorator的理解

1. self, cls 不是关键字
在python里面self, cls 不是关键字完全可以使用自己写任意变量代替实现效果
代码1
复制代码 代码如下:

MyTest:
myname = 'peter'
def sayhello(hello):
pr "say hello to %s" % hello.myname
__name__ "____":
MyTest.sayhello


代码1中, 用hello代替掉了self, 得到效果也可以替换成java中常用this.
结论 : self和cls只是python中约定写法本质上只是参数而已没有特别含义
任何对象思路方法都会把把自己作为该思路方法中个参数传递到(在python中万物都是对象所以当我们使用Class.method时候实际上个参数是我们约定cls)
2. 类定义可以动态修改
代码2
复制代码 代码如下:

MyTest:
myname = 'peter'
def sayhello(self):
pr "say hello to %s" % self.myname
__name__ "____":
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
pr MyTest.sayhello(MyTest.myname)
pr MyTest.saygoodbye(MyTest.myname)


这里修改了MyTest类中变量和定义 例子化instance有了区别行为特征
3. decorator
decorator是 接收作为参数 返回值是
代码3
复制代码 代码如下:

def enhanced(meth):
def (self, y):
pr "I am enhanced"
meth(self, y)

C:
def bar(self, x):
pr "some method says:", x
bar = enhanced(bar)


上面是个比较典型应用
以常用@method为例
正常使用思路方法是
代码4
复制代码 代码如下:

C:
@method
def foo(cls, y):
pr "method", cls, y


这里有个疑惑地方不是很明白: 如果个思路方法没有使用@method, 那么用Class.method方式是会报错但是@method是个decorator, 那么它返回也是为什么这样就可以直接被Class了呢?
Tags:  python decorator模式 decorator pythonself

延伸阅读

最新评论

发表评论