用参数继承类方法装饰器[重复]
Posted
技术标签:
【中文标题】用参数继承类方法装饰器[重复]【英文标题】:Inherit class method decorator with parameter [duplicate] 【发布时间】:2019-06-10 16:32:22 【问题描述】:我有一个基类,我想在其中定义一个装饰器。该装饰器应该用于继承类。
class Upper(object):
def model_definition(self, name):
def func(create_function):
if self.loading:
model = self.load(name)
else:
model = create_function()
self.models[name] = model
return model
return func
class Lower(Upper):
@Upper.model_definition(name='example_model'):
def define_model(self):
[...]
return model
当这样做时,我收到消息model_definition() missing 1 required positional argument: 'self'
。正确的做法是什么?
【问题讨论】:
也相关:***.com/questions/2365701/… 【参考方案1】:model_definition
方法需要一个实例,这就是参数self
所代表的含义。
现在,为了在实例上使用装饰器,您可以简单地将实例作为参数传递。这是一个装饰器是静态的示例:
class Upper(object):
def __init__(self):
self.model = None
@staticmethod
def model_definition(name=''):
def func(f):
def wrapper(*args):
self = args[0]
print('I am defining the model')
if not self.model:
self.model = name
return f(*args)
return wrapper
return func
class Lower(Upper):
def __init__(self):
Upper.__init__(self)
self.define_model()
@Upper.model_definition(name='example_model')
def define_model(self):
print('The model is : ', self.model)
主要:
l = Lower()
我正在定义模型
('模型是:', 'example_model')
【讨论】:
如果你只是使用静态方法作为装饰器,为什么要把它放在一个类中呢? 可读性和逻辑性。我想这就是为什么你仍然有 @staticmethod 装饰器的原因。但是,装饰器确实可以在类之外定义。以上是关于用参数继承类方法装饰器[重复]的主要内容,如果未能解决你的问题,请参考以下文章