Python 不从派生类继承某些(选定的)方法

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?(除了复制/粘贴之外,这不算

比如说,我有两个(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
为什么要这样做?类继承的整个要点是能够测试
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
isa
a
不再是真的,所有
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:很高兴能提供帮助!出于好奇;凯文的回答对我的补充是什么,你接受了他的职位?