【发布时间】:2017-07-10 07:36:09
【问题描述】:
我想知道是否可以在子类中使用描述符的装饰器。
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 的类定义中使用装饰器?
【问题讨论】:
标签: python python-3.x descriptor python-descriptors