注意使用父类的装饰:Python的装饰:如何在子类
对其他问题接受的答案显示了如何使用父decorater。
该问题的接受答案显示将装饰器移动到模块范围。
编辑:使用前面的例子是一个坏主意。希望这是更清晰:
class A:
def deco(func):
print repr(func)
def wrapper(self, *args):
val = func(*args)
self.do_something()
return val
return wrapper
def do_something(self):
# Do something
print 'A: Doing something generic for decoration'
@deco
def do_some_A_thing (self):
# Do something
print 'A: Doing something generic'
class B (A):
@deco
def do_some_B_thing(self):
# Do something
print "B: Doing something specific"
a = A()
b = B()
a.do_some_A_thing()
b.do_some_B_thing()
#Expected Output:
#A: Doing something generic
#A: Doing something generic for decoration
#B: Doing something specific
#A: Doing something generic for decoration
此代码生成一个NameError:名字“装饰”不是内部B. 定义的装饰需要是一流的范围内,因为我需要访问存储的状态。
三编辑:在斯文的建议,我尝试这样做:
class A:
def deco(func):
def wrapper(self, *args):
val = func(*args)
self.do_something(*args)
return val
return wrapper
def do_something(self):
# Do something
print 'A: Doing something generic for decoration'
@deco
def do_some_A_thing (self):
# Do something
print 'A: Doing something generic'
deco = staticmethod(deco)
class B (A):
@A.deco
def do_some_B_thing(self):
# Do something
print "B: Doing something specific"
a = A()
b = B()
a.do_some_A_thing()
b.do_some_B_thing()
#Expected Output:
#A: Doing something generic
#A: Doing something generic for decoration
#B: Doing something specific
#A: Doing something generic for decoration
我现在有类型错误:do_some_A_thing()恰恰(给出0)1个说法。任何指针?
你试过吗?你有错误吗? – bitcycle