用不同的参数装饰子类中的基类方法

时间:2018-11-01 12:52:05

标签: python

我有下面的代码和我想要达到的目标,如下所示。我有一个名为Base的基类,它有2个子类AB。这两个子类都有一个在其核心级别上做完全相同的事情的方法,但是随后我用不同的参数修饰了子类中的类方法。

我要实现的目标是消除重复项,因为它做的相同,并将其放在Base类中。

class Base(object):
    pass

class A(Base):
    @some_decorator(params = ('x', 'y'))
     def some_method(self):
         return "hello"

class B(Base):
    @some_decorator(params = ('a', 'b'))
     def some_method(self):
         return "hello"

因此可以将some_method移到Base,然后以某种方式在子类中调用它,然后用不同的参数修饰它。我知道它并不是很简单,因为方法没有在子类中定义。

修改

这就是我要提出的

class Base(object):
    args = ()
    @some_decorator(params = args)
     def some_method(self):
         return "hello"


class A(Base):
    args = ('x', 'y')
    pass

class B(Base):
    args = ('a', 'b')

这个问题是,当我从子类中调用方法时,会使用args中定义的空Base元组来调用该方法,因此我尝试像这样修改实际的装饰器调用

@format_list_users(params=self.__class__.args)

但这失败了,并抛出未定义self的错误

1 个答案:

答案 0 :(得分:0)

我能够像下面这样解决这个问题,现在看来这是一个很小的变化,但是后来我不得不为此挠头。

def some_decorator(params=None, func=None):
    if func is None:
        return partial(some_decorator, params)
    def wrapper(obj):
        print(getattr(obj, params))    # doing some stuff with args passed
        func(obj)    # actual method class
    return wrapper


class Base(object):
    args = ()
    @some_decorator(params = 'args')
     def some_method(self):
         return "hello"


class A(Base):
    args = ('x', 'y')
    pass

class B(Base):
    args = ('a', 'b')