【问题标题】: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'。正确的做法是什么?

【问题讨论】:

标签: python python-decorators


【解决方案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 装饰器的原因。但是,装饰器确实可以在类之外定义。
猜你喜欢
  • 2012-11-14
  • 2019-11-27
  • 2021-02-21
  • 2018-07-10
  • 2018-09-17
  • 2018-04-17
  • 2011-03-23
  • 2018-01-16
  • 2016-05-19
相关资源
最近更新 更多