假设您有一个包含大量(数百个!)方法的 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)
这似乎真的有效。不过感觉有点太简单了,肯定还有一些玄乎的问题吧?无论如何,谢谢你们让我弄明白了!
最佳答案
希望对您有所帮助:
# the base class
class B(object):
def f1(self, val):
pass
def f2(self, val):
pass<p></p>
<p>def decorator(cls, f):
def g(self, *args, **kwargs):
# do stuff
result = f(self, *args, **kwargs)
# do more stuff
return g</p>
<p>class A(B):
_overridden = ['f1', 'f2']
@classmethod
def load(cls):
for name in cls._overridden:
setattr(name, decorator(getattr(name).im_func))</p>
<p>A.load()
</p>
为了处理类和静态方法,可能需要做一些改变。
关于python - 如何有效且系统地重载Python类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4718520/