2011-08-17 163 views
1

说我有以下几点:儿童功能

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 

什么是优雅的方式来增加条件2FUNC,而无需重新复制整个功能?请注意,我实际上在嵌套'ifs'中有两个附加条件。

回答

6

如果你有机会到家长,你可以做

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

添加,做的比较新的方法(函数)(上儿童返回上家长条件1和条件2条件1)。你只需要在子类中修改该函数。

对不起团购,我不能写一个例子,因为我不知道Python的:P

+1

大多数投票的答案正是我这里说的...唉... – m0skit0 2011-08-17 12:54:53

+0

答案是更好地接受,当他们有示例代码,而他的回答就在同一时间是你的,所以你没有得到一个机会,在他抵达之前得到upvoted。 – agf 2011-08-17 13:19:49

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 
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也可以是另一个staticmethodParent如果是在两个相同的。