使用Python

时间:2017-10-17 09:02:27

标签: python inheritance override

考虑以下使用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个不同的函数(cat1cat2cat3,...),它们返回相同类型的数据,我们想要使用经过后期处理的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

或者甚至是另一种不使用继承的解决方案。

谢谢!

1 个答案:

答案 0 :(得分:0)

这个答案,使用一个包装类来接收构造函数中的原始类(而不是继承它),解决了这个问题:

https://stackoverflow.com/a/4723921/3444175