我想知道是否可以在子类中使用描述符的装饰器。
class Descriptor():
def __get__(self, instance_obj, objtype):
raise Exception('ouch.')
def decorate(self, f):
print('decorate', f)
return f
class A():
my_attr = Descriptor()
class B():
@my_attr.decorate
def foo(self):
print('hey, whatsup?')
# --> NameError: name 'my_attr' is not defined
当然,这不起作用,因为my_attr
在 的类定义中未定义B
。
接下来我尝试了:
class B():
@A.my_attr.decorate
def foo(self):
print('hey, whatsup?')
# --> Exception: ouch.
但是,这种方法会调用描述符__get__
方法(instance_obj
参数为None
),因此会触发测试异常。要访问装饰器,可以检查是否instance_obj
返回None
描述符本身:
def __get__(self, instance_obj, objtype):
if instance_obj is None:
return self
raise Exception('avoid this')
# --> decorate <function B.foo at 0x1021dd7b8>
有用!但这是合理的还是有办法在 的类定义中使用装饰器B
?