考虑以下使用python中的继承进行后处理的示例(来自this website):
import os
class FileCat(object):
def cat(self, filepath):
f = file(filepath)
lines = f.readlines()
f.close()
return lines
class FileCatNoEmpty(FileCat):
def cat(self, filepath):
lines = super(FileCatNoEmpty, self).cat(filepath)
nonempty_lines = [l for l in lines if l != '\n']
return nonempty_lines
基本上,当我们进行后处理时,我们并不真正关心原始调用,我们只想处理函数返回的数据。
理想情况下,在我看来,我们不需要重新声明原始功能签名,只是为了能够将其转发到原始功能。
如果FileCat
类有100个不同的函数(cat1
,cat2
,cat3
,...),它们返回相同类型的数据,我们想要使用经过后期处理的NoEmpty
版本,我们必须在FileCatNoEmpty
中定义相同的100个函数签名才能转发调用。
所以问题是:有没有更优雅的方法来解决这个问题?
就像FileCatNoEmpty
类一样,它会自动提供FileCat
中的所有方法,但仍允许我们处理返回的值?
像
这样的东西class FileCatNoEmpty(FileCat):
# Any method with whatever arguments
def f(self,args):
lines = super(FileCatNoEmpty, self).f(args)
nonempty_lines = [l for l in lines if l != '\n']
return nonempty_lines
或者甚至是另一种不使用继承的解决方案。
谢谢!
答案 0 :(得分:0)
这个答案,使用一个包装类来接收构造函数中的原始类(而不是继承它),解决了这个问题: