如何在python中实现动态多态

时间:2014-01-02 10:58:53

标签: python python-2.7

我想像在java中一样在python中实现动态多态。可能吗?如果是,请指导我如何。我想实现这样的事情:

class A {
    public void show() {
        System.out.println("Base class");
    }
}

class B extends A{
    public void show() {
        System.out.println("Derived class");
    }
} 

class C {
    public static void main(String args[]) {
        A a = new B();
        a.show(); // so it will call B's show method. 
    }
}

4 个答案:

答案 0 :(得分:2)

当然有可能。实际上,Python在这个意义上更强大,因为它只有动态类型。在下面的示例中,您甚至不需要从A派生B.

class A:
    def show(self):
        print "Base class"

class B(A):  # this would also work fine without deriving: class B: 
    def show(self):
        print "Derived class"

a = A()
a.show()
a = B()
a.show()

当解释器遇到表达式a.show()时,它只查找对象'a'并检查它是否实现了方法'show'。如果是,则无论继承或其他什么,它都会运行此方法。如果找不到“show”,则会引发异常。

答案 1 :(得分:2)

您的问题在这里:

A a = new B();

因为Python是动态的,所以无法声明变量的类型为A,因此在a = B()之后名称 {在您删除或重新绑定名称之前,总是始终 绑定a对象。

答案 2 :(得分:0)

在Python(2.x)中,您可以执行以下操作:

class A(object): # inherit from base object
    def show(self): # define function to inherit
        print "Base class"

class B(A): # inherit from A
    def show(self): # override A.show()
        print "Derived class"

a = B() # instance of derived class B
a.show() # would print "Derived class"

请注意,由于AB的继承:

isinstance(a, A) == True

或者,您可以这样做:

a = A() # instance of base class A
a.show = B().show # use B's method for this instance of A

答案 3 :(得分:0)

对我而言,这个问题似乎无关紧要。由于Python对类使用“duck typing”,因此实际创建实例的类的show方法将是所调用的类。

鸭子打字:

http://en.wikipedia.org/wiki/Duck_typing