比如说,我有两个(python(3.3))类a和b有自己的方法:
class a:
def m1(self):
print("Hi 1")
def m2(self):
print("Hi 2")
##...other methods...
class b(a):
def k1(self):
print("Other hi")
如何使b
继承a
的所有方法,除了(例如)m2
? (除了复制/粘贴,这不算数。)所以表达式a.m2()
是合法的,但b.m2()
会抛出AttributeError
。
答案 0 :(得分:1)
你为什么要那样做?类继承的整个 point 是能够测试b
的实例也是a
的实例;由于某种原因,isinstance(b(), a)
True
。通过从b
中删除方法,您正在严重破坏该模型。
相反,让a
的方法更少,并添加c
以获得b
不需要的方法:
class a:
def m1(self):
print("Hi 1")
##...other methods...
class b(a):
def k1(self):
print("Other hi")
class c(a):
def m2(self):
print("Hi 2")
或者,您不能继承a
,只需根据需要从a
复制方法:
class b:
# copied methods
m1 = a.m1
def k1(self):
print("Other hi")
现在b
isa a
不再是真的,期望所有a
的方法都已经实现了。
如果a
完全超出您的控制范围且复制方法太多,可能会使用__getattr__
代理并通过m2
之外的任何内容。最后一种方法可能是实施m2
并提升AttributeError
,但这应该是最后的手段。
答案 1 :(得分:1)
你可以通过制作'a'和'b'兄弟而不是父母和孩子来获得你想要的效果。这可能适合你:
class p:
def m1(self):
print("Hi 1")
class a(p):
def m2(self):
print("Hi 2")
class b(a):
def k1(self):
print("Other hi")
所以这些方法现在都是有效的,其他方法将抛出AttributeErrors:
a.m1()
a.m2()
b.m1()
b.k1()
答案 2 :(得分:0)
如果b
继承自a
,则应该继承每个方法。这是继承。但如果有必要这样做(不推荐注意),您可以覆盖m2()
方法,因此在调用时会引发Exception
。
class b(a):
def m2(self):
raise Exception("...")
答案 3 :(得分:0)
这没有多大意义。继承点是继承对象与基类型完全兼容的。这是Liskov substitution principle:只要原始类型的对象可以接受,派生类型的对象也将是。
如果您将派生类型更改为不具有基本类型的某些成员,那么您违反了此原则。使用Python中的动态类型,它不会是一个问题,但它仍然违反了它背后的想法。
所以你真的不应该这样做。