2014-09-02 74 views
1

我在添加属性时遇到尝试继承python类的问题。为了说明这一点,确定以下类别:在添加属性时继承python类

class A: 
    def __init__(self, prop, x1, x2): 
     self.prop = prop 
     self.x = x1 + x2 


class B(A): 
    def __init__(self, prop, x1, x2): 
     super().__init__(prop, x1, x2) 

    @property 
    def prop(self): 
     return self._prop 

    @prop.setter 
    def prop(self, value): 
     self._prop = value + 10 

现在类B要调用类A__init__方法,它会调用B.prop的制定者。但我不想这样做,而是直接设置_prop。有没有一个很好的方法来实现这一目标?

以下是我通过尝试检测我们是否在__init__而提出的解决方案,但我希望听到一些替代方案。

class B(A): 
    def __init__(self, prop, x1, x2): 
     super().__init__(prop, x1, x2) 

    @property 
    def prop(self): 
     return self._prop 

    @prop.setter 
    def prop(self, value): 
     if hasattr(self, '_prop'): 
      self._prop = value + 10 
     else: 
      self._prop = value 
+1

我很难想象这个用例...?你介意解释你想达到的目标吗?这可能会导致更广泛地投入到您之后的设计模式中。 – 2014-09-02 23:51:27

+0

我明白了你的观点,这有点难,但我会尝试给出更具体的用例。 – simonzack 2014-09-03 00:08:04

回答

1

似乎有什么你正在寻找一种方式来揭露子类,B的实施细则,父类,A.__init__的方法。我会称之为反模式,而不是一个理想的模式。

如果行为的父类的__init__(设置self.prop)不与子类的执行工作,那么你应该在子类中重写__init__以免调用super().__init__

我同意Jon Clements' comment。你的代码的目标是什么?通常,创建一个类来封装一些有用的行为。当孩子阶层从父母的行为中大量借用,并且可以在父母的内部没有过多地使用它的情况下继承这个类时,从该类继承是有意义的。