【发布时间】:2011-11-20 08:19:57
【问题描述】:
注意:
另一个问题的接受答案显示了如何使用父装饰器。
这个问题的公认答案显示将装饰器移动到模块范围。
编辑:使用前面的例子是个坏主意。希望这更清楚:
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: name 'deco' is not defined inside B. 装饰器需要在类范围内,因为我需要访问存储的状态。
第三次编辑:根据 Sven 的建议,我尝试了这个:
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
我现在有 TypeError: do_some_A_thing() 只需要 1 个参数(给定 0)。有什么指点吗?
【问题讨论】:
-
您是否尝试过这样做?你收到错误了吗?