假设你有一个Python(> = 2.6)类,有很多(数百!)个方法。现在有人想要继承它,但意识到大多数基类方法只需要一些简单的“调整”。此外,只有少数不同的方法可以调整这些方法。一些涉及输入转换,一些输出转换,一些涉及。
更具体地说,我正在寻找一个(简单)继承的解决方案,我可以提供基类和应用特定转换的方法列表(列表),而不是将每个样板代码添加到每个重载方法。
谢谢, 吃
跟进。
根据gabo10yf的答案,我提出了一个解决方案:
class B(object):
def f1(self, val):
print '1: ', val
def f2(self, val):
print '2: ', val
def decorator(f):
def g(self, *args, **kwargs):
print 'entering'
result= f(self, *args, **kwargs)
return g
class A(B):
pass
_overridden= ['f1', 'f2']
def override(cls):
for name in _overridden:
setattr(cls, name, decorator(getattr(cls, name).im_func))
override(A)
if __name__== '__main__':
b= B()
b.f1(1)
b.f2(2)
a= A()
a.f1(1)
a.f2(2)
它似乎真的有效。然而它感觉几乎太简单了,它肯定还必须包含一些模糊的问题?无论如何,谢谢你们让我弄清楚这一点!
答案 0 :(得分:2)
我建议使用某种形式的面向预期的编程。使用Logilab library,可以很容易地将包装器放在类的所有方法中。
答案 1 :(得分:2)
我希望这会有所帮助:
# the base class
class B(object):
def f1(self, val):
pass
def f2(self, val):
pass
def decorator(cls, f):
def g(self, *args, **kwargs):
# do stuff
result = f(self, *args, **kwargs)
# do more stuff
return g
class A(B):
_overridden = ['f1', 'f2']
@classmethod
def load(cls):
for name in cls._overridden:
setattr(name, decorator(getattr(name).im_func))
A.load()
为了处理类和静态方法,可能需要做一些更改。
答案 2 :(得分:0)
在我继承之前,我会考虑装饰器。
我也会考虑重构那个类 - 数百种方法向我提出“上帝反模式”。
答案 3 :(得分:0)