如何从子类的基类访问装饰器?
我(错误地)假设 ffg.会工作:
class baseclass(object):
def __init__(self):
print 'hey this is the base'
def _deco(func):
def wrapper(*arg):
res = func(*arg)
print 'I\'m a decorator. This is fabulous, but that colour, so last season sweetiedarling'
return res
return wrapper
@_deco
def basefunc(self):
print 'I\'m a base function'
这个类工作正常,但后来我创建了一个继承自这个的子类:
class otherclass(baseclass):
def __init__(self):
super(otherclass, self).__init__()
print 'other class'
@_deco
def meh(self):
print 'I\'m a function'
这甚至无法正确导入,更不用说运行了。 @_deco 未定义。尝试 baseclass._deco 会引发未绑定(bind)方法 _deco() 错误,这并不奇怪。
知道如何做到这一点,我真的很想将装饰器封装在类中,但我没有接受这个想法,我需要在基类和子类中调用它。
最佳答案
class baseclass(object):
def __init__(self):
print 'hey this is the base'
def _deco(func):
def wrapper(*arg):
res = func(*arg)
print 'I\'m a decorator. This is fabulous, but that colour, so last season sweetiedarling'
return res
return wrapper
@_deco
def basefunc(self):
print 'I\'m a base function'
@_deco
def basefunc2(self):
print "I'm another base function"
#no more uses of _deco in this class
_deco = staticmethod(_deco)
# this is the key. it must be executed after all of the uses of _deco in
# the base class. this way _deco is some sort weird internal function that
# can be called from within the class namespace while said namespace is being
# created and a proper static method for subclasses or external callers.
class otherclass(baseclass):
def __init__(self):
super(otherclass, self).__init__()
print 'other class'
@baseclass._deco
def meh(self):
print 'I\'m a function'
关于python - 在 Python 中从子类访问父类中的装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3421337/