Python 不从派生类继承某些(选定的)方法
比如说,我有两个(python(3.3))类a和b,它们有自己的方法:Python 不从派生类继承某些(选定的)方法,python,inheritance,Python,Inheritance,比如说,我有两个(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?(除了复制/粘贴之外,这不算
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
为什么要这样做?类继承的整个要点是能够测试b
的实例也是a
的实例<代码>isinstance(b(),a)是真的
是有原因的。通过从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
isaa
不再是真的,所有a
方法都实现的期望将不再存在
如果
a
完全不受您的控制,并且有太多的方法需要复制,那么可以使用\uuu getattr\uuuu
代理并传递除m2
之外的任何内容。最后的办法可能是实现m2
并提高AttributeError
,但这应该是最后的办法。如果b
继承自A
,它应该继承每一个方法。这就是遗产。但是如果有必要这样做(请注意,不建议这样做),您可以重写m2()
方法,因此调用时会引发异常
class b(a):
def m2(self):
raise Exception("...")
这真的没有道理。继承的要点是使继承对象与基类型完全兼容。这就是:只要原始类型的对象是可接受的,派生类型的对象也将是可接受的
如果将派生类型更改为不包含某些基类型的成员,则违反了此原则。使用Python中的动态类型,这不会有太大问题,但它仍然违反了它背后的理念
所以你真的不应该这么做。你可以通过让“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")
因此,这些方法现在都有效,其他方法将抛出AttributeError:
a.m1()
a.m2()
b.m1()
b.k1()
Python是否允许您定义b.m2()
直接抛出该错误?我的意思是,您可以将函数定义重写为throw new AttributeError()
(或任何适当的语法)…相反,不从a继承是正确的解决方案。只要根据需要从a
复制方法就行了。复制的代码会很多,所以我想我会坚持你的第二个选择。谢谢,在冷却期结束后接受回答。@Thornshadow17432:很高兴能提供帮助!出于好奇;凯文的回答对我的补充是什么,你接受了他的职位?