例如,我们有一个名为A的基类,以及三个名为BCD的子类,都是A的继承。如果我想某些方法只出现在B和C中,而不是出现在D.我应该把这个方法放在哪里? / p>
如果我把它放在A中,D将拥有它不需要的方法。
如果我把它放在B和C中,我会重复一遍。
答案 0 :(得分:2)
如果它意味着"相同"在B和C中都可见的方法,听起来你需要在A下面的层次结构中添加另一个类,但是在B和C之上。让我们把它称为E.你将D和E作为子类A,B和C作为E的子类。
答案 1 :(得分:0)
你可以在你的概念中做两件事
如果仍然无法对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上很重要,但在复制代码时并不大,所以在这种情况下这可能不是最佳解决方案。