不从派生类继承一些(选择的)方法

时间:2014-02-01 14:26:12

标签: 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? (除了复制/粘贴,这不算数。)所以表达式a.m2()是合法的,但b.m2()会抛出AttributeError

4 个答案:

答案 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中的动态类型,它不会是一个问题,但它仍然违反了它背后的想法。

所以你真的不应该这样做。