我想像在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.
}
}
答案 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"
请注意,由于A
中B
的继承:
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方法将是所调用的类。
鸭子打字: