我已经浏览了很多链接,但是使用python理解多态性的最简单方法是什么。有没有简单的例子。根据我的理解,多态性是一个对象可以采用不止一次形式的概念。任何人都可以告诉我任何简单的例子,而不是复杂的
http://swaroopch.com/notes/python_en-object_orientation_programming/
http://www.tutorialspoint.com/python/python_classes_objects.htm
我已经浏览了很多链接,但是使用python理解多态性的最简单方法是什么。有没有简单的例子。根据我的理解,多态性是一个对象可以采用不止一次形式的概念。任何人都可以告诉我任何简单的例子,而不是复杂的
http://swaroopch.com/notes/python_en-object_orientation_programming/
http://www.tutorialspoint.com/python/python_classes_objects.htm
这看起来是一个很好且简单的示例:
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 使用鸭子类型来实现多态性,如果您想了解更多信息,请搜索该短语。
静态语言主要依赖于继承作为实现多态性的工具。另一方面,动态语言依赖于鸭子类型。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 编程。