这是一个很好的python多态性示例吗?

时间:2015-10-08 15:23:12

标签: python inheritance polymorphism

我刚开始从视频课程学习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类(当然还有继承),代码的工作原理完全相同。所以我想如果你不使用基类那么那不是真正的多态性。

我是对还是错?有人可以修改这个例子,所以它实际上提出了多态的要点(即实际上使用了基类)?

2 个答案:

答案 0 :(得分:1)

多态性意味着在子类中更改基类函数的实现,因此本示例确实演示了它。如果您删除了基类network,则mac将无法再调用switch,因此基类仍有一些功能。

当然,如果符合以下条件,那将是一个更好的例子:

  • 他们在主函数中调用switch上的mac,以证明network类已被多态化,而不仅仅是重新实现。
  • 他们将类名称大写,这是每个人都使用的Python约定。

答案 1 :(得分:0)

多态性的要点是为不同的实体提供接口。在面向对象编程中,多态性通常通过子类型多态性来实现。

在您的示例中,您拥有Network,这是一种界面,包含一堆实体,TokenRingEthernet

在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的metaclassabc module