2013-09-05 158 views

回答

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! 

BTW Python使用鴨打字實現多態,如果您想了解更多搜索這句話。

1

靜態語言主要依賴繼承作爲實現多態的工具。 動態語言另一方面取決於鴨子打字。 Duck typing支持多態而不使用繼承。在這種情況下,您需要在每個擴展類中實現相同的一組相關方法。

維基百科鴨打字頁

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() 

儘量想與那些有相同的協議之間的協議(一組的方法)和互換性對象。

duck typing definition從python.org:

一種編程風格,不看對象的類型,以 確定它是否有合適的接口;相反,該方法或 屬性只是簡單地調用或使用(「如果它看起來像一隻鴨子,像一隻鴨子,它肯定是一隻鴨子。」)通過強調接口 而不是特定類型,精心設計的代碼改進了它的通過允許多態性替換來實現靈活性。使用type()或isinstance(),鴨式打樣可避免 測試。 (但是,請注意,鴨子打字 可以補充抽象基類。)相反,它通常使用hasattr()測試或EAFP編程。