永远爱学习

导航

Python 描述器用作装饰器

import types


class Dog:
fly = False

def __init__(self, func):
self.func = func

# 只有Dog作为类属性的时候,才需要用到__get__方法,否则不用。例如Dog作为test()方法的装饰器的时候,
# 就用不到__get__
def __get__(self, instance, owner):
print("instance:{},owner:{}".format(instance, owner))
if instance is None:
return self
# 用MethodType将方法绑定到类,并不是将这个方法直接写到类内部,
# 而是在内存中创建一个link指向外部的方法,在创建实例的时
# 候这个link也会被复制;下面的代码中,将描述器绑定到了instance对象,然后调用people.walk()的时候,
# 其实调用的是描述器对象的__call__
    #
如果我们想让一个模块方法在调用的时候自动传入被调用对象作为self参数,那么可以使用typesMethodType() 方法实现

return types.MethodType(self, instance)

# p.walk() 和 test()都会调用__call__
def __call__(self, *args, **kwargs):
# print(args)
return self.func(*args, **kwargs)


class People:
@Dog
def walk(self):
print('onece')
print('working')


p = People()

print(p.walk())
print(p.walk())
print(p.walk())


@Dog
def test(a, b):
print(a + b)


test(1, 5)
print(test.fly)

posted on 2018-10-19 15:04  永远爱学习  阅读(223)  评论(0)    收藏  举报