类继承:在哪里放一个方法?

时间:2015-12-15 04:57:58

标签: python oop

例如,我们有一个名为A的基类,以及三个名为BCD的子类,都是A的继承。如果我想某些方法只出现在B和C中,而不是出现在D.我应该把这个方法放在哪里? / p>

如果我把它放在A中,D将拥有它不需要的方法。

如果我把它放在B和C中,我会重复一遍。

4 个答案:

答案 0 :(得分:2)

如果它意味着"相同"在B和C中都可见的方法,听起来你需要在A下面的层次结构中添加另一个类,但是在B和C之上。让我们把它称为E.你将D和E作为子类A,B和C作为E的子类。

答案 1 :(得分:0)

你可以在你的概念中做两件事

  1. 如果所有的B,C和D都需要从A中继承,并且有一种方法不应该来自A,那么也许你需要重新处理A中需要的方法以避免这种情况。 / LI>
  2. 如果仍然无法对A进行任何更改,并且仍然需要从A继承,则最好提出未实现/不支持的错误,如下所示

    class D(object):
    """docstring for D"""
    def __init__(self, arg):
        super(D, self).__init__()
        self.arg = arg
    
    def methodThatWasNotSupposedToComeHere(some_params ):
        raise NotImplementedError("This is not supported")
    

答案 2 :(得分:0)

没有'标准'与其他语言不同,这样做的方式 您可以覆盖它,以便引发异常。

class Human( object ):
    def walk( self ):
        print 'walking...'

class Baby(Human)
    def walk( self ):
        raise NotImplementedError("can't right now")

class Teenager(Human):
...

答案 3 :(得分:0)

在这方面,Python是一种非常灵活的语言。

您可以在C和D类范围之外定义您的方法,并将它们分别绑定到它们:

class A(object):
    pass

class B(A):
    pass

def method(self):
    print '%s.method()' % type(self).__name__

class C(A):
    method = method

class D(A):
    method = method

c = C()
d = D()

c.method() # prints "C.method()"
d.method() # prints "D.method()"

print c.method # prints "<bound method C.method of <__main__.C object at 0x????????>>"
print d.method # prints "<bound method D.method of <__main__.D object at 0x????????>>"

您可以引入一个继承自A的新类,在此类中定义您的方法并从此新类继承C和D.这是经典&#39; OOP方法。

您可以在A中实现您的方法并在B中覆盖它,告诉它引发一些异常。最好是NotImplementedError以外的东西,因为它打算用在抽象类中 - AttributeError似乎是一个更好的候选者。请注意,如果您不打算在代码中实例化A类,那么A.method会引发NotImplementedError,有效地将A转换为抽象类。

你可以使用duck-typing并在C和D中简单地实现两个相同的方法.Python在duck-typing上很重要,但在复制代码时并不大,所以在这种情况下这可能不是最佳解决方案。