【问题标题】:Is this a good python polymorphism example?这是一个很好的python多态示例吗?
【发布时间】:2016-01-06 07:40:10
【问题描述】:

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

我是对还是错?有人可以修改这个例子,让它真正呈现多态性的要点(即实际上利用了基类)吗?

【问题讨论】:

标签: python inheritance polymorphism


【解决方案1】:

多态性的主要目的是为不同的实体提供接口。在面向对象的编程中,多态性通常是通过subtyping polymorphism来实现的。

在您的示例中,您有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

【讨论】:

  • “在 Python 中,变量没有类型,因此多态性的优势更难暴露。” - 这就是我问题的重点!我知道示例代码在技术上可能会使用多态性,但它并没有暴露出一个好的教学示例应该
  • @NPS 是的,但是涉及元类或 abc 模块的教学示例对于初学者来说应该更难理解。实际上,您的代码使用了多态性,但我认为(而且它确实是个人的)Python 并不是介绍它的最佳语言 :)
【解决方案2】:

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

当然,如果:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    相关资源
    最近更新 更多