具有附加条件的儿童功能

时间:2011-08-17 12:44:29

标签: python

说我有以下内容:

class Parent(object):
    [...]
    def func(self, list):
        for item in list:
            if condition1:
                do something

class Child(Parent):
    [...]
    def func(self, list):
        for item in list:
            if condition1 and condition2:
                do something

condition2 添加到 func 而不必重新复制整个函数的优雅方法是什么?请注意,我实际上在嵌套的'ifs'中有两个附加条件。

4 个答案:

答案 0 :(得分:6)

如果您有权访问Parent,则可以

class Parent(object):
    [...]
    def _condition(self, whatever):
        return condition1
    def func(self, list):
        for item in list:
            if self._condition(...):
                do something

class Child(Parent):
    [...]
    def _condition(self, whatever):
        return condition1 and condition2

答案 1 :(得分:4)

另一种方法是评估其他方法中的条件并覆盖子项:

class Parent(object):
    [...]
    def func(self, list):
        for item in list:
            if self.test(item):
                do something

    def test(self, item):
        return condition1

class Child(Parent):
    [...]
    def test(self, item):
        return super(Child, self).test(list) and condition2

答案 2 :(得分:1)

添加一个进行比较的新方法(函数)(在 Parent 上返回 condition1 ,在 Child <上返回 condition1和condition2 / em>的)。您只需要在子类中修改该函数。

抱歉买我不能写一个例子因为我不懂Python:P

答案 3 :(得分:1)

from functools import partial

class Parent(object):
    [...]
    def func(self, list, condition = lambda item: condition1):
        for item in list:
            if condition(item):
                do something

class Child(Parent):
    [...]

    def func(self, list): 
        super(Child, self).func(list, condition = lambda item: condition1 and condition2)

如果你只想改变那个条件,或者

class Parent(object):
    [...]
    def func(self, list):
        for item in list:
            self.whatever(item)

    @staticmethod
    def whatever(item):
        if condition1:
            do something
class Child(Parent):
    [...]
    @staticmethod
    def whatever(item):
        if condition1 and condition2:
            do something

如果你想在循环中改变多个东西。 do something staticmethod也可以是Parent上的另一个{{1}},如果两者都相同的话。{/ p>