我有下面的代码和我想要达到的目标,如下所示。我有一个名为Base
的基类,它有2个子类A
和B
。这两个子类都有一个在其核心级别上做完全相同的事情的方法,但是随后我用不同的参数修饰了子类中的类方法。
我要实现的目标是消除重复项,因为它做的相同,并将其放在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
的错误
答案 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')