我刚开始从视频课程学习python,在本课程中作为多态的一个例子提供了这段代码:
class network:
def cable(self): print('I am the cable')
def router(self): print('I am the router')
def switch(self): print('I am the switch')
class tokenRing(network):
def cable(self): print('I am a token ring network cable')
def router(self): print('I am a token ring router')
class ethernet(network):
def cable(self): print('I am an ethernet network cable')
def router(self): print('I am an ethernet router')
def main():
windows=tokenRing()
mac=ethernet()
windows.cable()
mac.cable()
main()
现在,我并不认为这是一个很好的多态性示例。我不确定这是多态吗!实际上,如果我删除network
类(当然还有继承),代码的工作原理完全相同。所以我想如果你不使用基类那么那不是真正的多态性。
我是对还是错?有人可以修改这个例子,所以它实际上提出了多态的要点(即实际上使用了基类)?
答案 0 :(得分:1)
多态性意味着在子类中更改基类函数的实现,因此本示例确实演示了它。如果您删除了基类network
,则mac
将无法再调用switch
,因此基类仍有一些功能。
当然,如果符合以下条件,那将是一个更好的例子:
switch
上的mac
,以证明network
类已被多态化,而不仅仅是重新实现。答案 1 :(得分:0)
多态性的要点是为不同的实体提供接口。在面向对象编程中,多态性通常通过子类型多态性来实现。
在您的示例中,您拥有Network
,这是一种界面,包含一堆实体,TokenRing
和Ethernet
。
在Java或C ++这样的语言中,变量是键入的,多态的一个常见用法是创建一个接口数组并用异构实现填充它。然后,您可以在具体实现上使用接口声明的方法。
考虑例如:
interface Animal {
String talk();
}
class Cat implements Animal {
String talk() {
return "Meow";
}
}
class Human implements Animal {
String talk() {
return "Hello";
}
}
在你的代码中,你现在可以制作一系列动物,盲目地用猫和人类填充它。此外,您可以在每个元素上调用talk()
!
在Python中,变量不是类型化的,因此多态性的优点更难以公开
总之,如果您正在搜索接口机制,可以查看Python的metaclass和abc
module。