3

我已经浏览了很多链接,但是使用python理解多态性的最简单方法是什么。有没有简单的例子。根据我的理解,多态性是一个对象可以采用不止一次形式的概念。任何人都可以告诉我任何简单的例子,而不是复杂的

http://swaroopch.com/notes/python_en-object_orientation_programming/

http://www.tutorialspoint.com/python/python_classes_objects.htm

4

2 回答 2

6

这看起来是一个很好且简单的示例:

http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming#Example

从维基百科文章复制的示例:

class Animal:
    def __init__(self, name):    # Constructor of the class
        self.name = name
    def talk(self):              # Abstract method, defined by convention only
        raise NotImplementedError("Subclass must implement abstract method")

class Cat(Animal):
    def talk(self):
        return 'Meow!'

class Dog(Animal):
    def talk(self):
        return 'Woof! Woof!'

animals = [Cat('Missy'),
           Dog('Lassie')]

for animal in animals:
    print(animal.name + ': ' + animal.talk())


# prints the following:
# Missy: Meow!
# Lassie: Woof! Woof!

顺便说一句,python 使用鸭子类型来实现多态性,如果您想了解更多信息,请搜索该短语。

于 2013-09-05T17:49:04.070 回答
1

静态语言主要依赖于继承作为实现多态性的工具。另一方面,动态语言依赖于鸭子类型。Duck 类型在不使用继承的情况下支持多态性。在这种情况下,您需要在每个扩展类中实现相同的一组相关方法。

来自维基百科鸭子打字页面

 class Duck:
    def quack(self):
        print("Quaaaaaack!")
    def feathers(self):
        print("The duck has white and gray feathers.")

class Person:
    def quack(self):
        print("The person imitates a duck.")
    def feathers(self):
        print("The person takes a feather from the ground and shows it.")
    def name(self):
        print("John Smith")

def in_the_forest(duck):
    duck.quack()
    duck.feathers()

def game():
    donald = Duck()
    john = Person()
    in_the_forest(donald)
    in_the_forest(john)

game()

尝试考虑具有协议(一组方法)的对象以及具有相同协议的对象之间的可互换性。

来自 python.org 的鸭子类型定义:

一种编程风格,它不查看对象的类型来确定它是否具有正确的接口;相反,方法或属性只是简单地调用或使用(“如果它看起来像鸭子,叫起来像鸭子,那它一定是鸭子。”)通过强调接口而不是特定类型,设计良好的代码通过允许多态替换。Duck-typing 避免了使用 type() 或 isinstance() 的测试。(但是请注意,duck-typing 可以用抽象基类来补充。)相反,它通常使用 hasattr() 测试或 EAFP 编程。

于 2013-09-05T17:51:17.143 回答