1、下面是第一个类装饰器
def decorator(cls):
class Wrapper:
def __init__(self, *args):
self.wrapped = cls(*args)
def __getattr__(self, name):
return getattr(self.wrapped, name)
return Wrapper
@decorator
class C:
def __init__(self, x, y):
self.attr = 'spam'
2、下面是第二个类装饰器
class Decorator:
def __init__(self, C):
self.C = C
def __call__(self, *args):
self.wrapped = self.C(*args)
return self
def __getattr__(self, attrname):
return getattr(self.wrapped, attrname)
@Decorator
class C: ...
我看到书上说,第二个类装饰器和第一个不同,第二个没有能够处理给定的类的多个实例——每个实例创建调用都覆盖了前面保存的实例。第一个类装饰器却支持多个实例,因为每个实例创建调用产生了一个新的独立的包装器对象。
请问怎么理解上面这段话,为何第二个类装饰器在每个实例创建时都会覆盖前面保存的实例呢? 感谢指点!
1
lolizeppelin 2017-08-21 09:43:50 +08:00
去看描述器 看完再回来看你的问题
|
2
lolizeppelin 2017-08-21 09:51:15 +08:00
哦理解错,我以为是类里面的装饰器 ,你这是装饰类的装饰器
这不很简单么第二个类装饰器可以预接参数成为实例,然后装饰类的时候是这个实例的 call 方法去套 第一个是相当于把这个装饰器类实例化,初始化参数就是一个类 装饰器就是套娃语法糖 func(func(func())) 自己套一下就知道了 |
3
saximi OP @lolizeppelin 谢谢,你写得话我基本能看明白,但是我还是无法和我的问题联系起来理解,第二个类装饰器是调用 Decorator.__call__方法,可这和“没有能够处理给定的类的多个实例——每个实例创建调用都覆盖了前面保存的实例”这句话有什么关系?
|
4
saximi OP @lolizeppelin 我不知道要怎么理解这句话“没有能够处理给定的类的多个实例——每个实例创建调用都覆盖了前面保存的实例。” ,覆盖?怎么个覆盖法?
|
5
lrxiao 2017-08-22 00:26:19 +08:00
因为只是在调用一个 global 的 functor instance (
|
6
saximi OP @lrxiao 您是说 self.C 是从外部传入的参数,所以可以看做是 global 的实例化方法,但是 cls 就是作用域在 wrapper 定义域内的实例化方法么?
|
7
saximi OP |