Class類
對于多态的了解:在菜鳥教程中,作者把多态這部分定義為對父類方法的重寫。
子類可以直接在類定義中重寫書寫父類的方法而不會影響到父類的方法的實作。
教材:《Python基礎與大資料應用》這本書将這部分操作定義為類的多态,這部分操作叫做類的多态性,每一個子類都可以對父類進行重定義。
class Animal: def __init__(self, name): self.name = name def say_myname(self): print('In Animal class:my name is %s' % self.name)class Cat(Animal): def __init__(self, name): self.name = name def say_myname(self): print('In Cat class:my name is %s' % self.name)class Dog(Animal): def __init__(self, name): self.name = name def say_myname(self): print('In Dog class:my name is %s' % self.name)class Tiger(Animal): def __init__(self, name): super().__init__(name) self.name = name def say_myname(self): print('In Tiger class:my name is %s' % self.name)def test_function(obj): print('%s say:' % obj.name) obj.say_myname()animal1 = Animal('animal')cat = Cat('cat')dog = Dog('dog')tiger = Tiger('tiger')ls = [animal1, cat, dog, tiger]for i in ls: print(i.name) test_function(i)print(isinstance(animal1,Animal))print(isinstance(cat,Animal))print(isinstance(cat,Cat))print(isinstance(dog,Animal))print(isinstance(dog,Dog))print(isinstance(tiger,Animal))print(isinstance(tiger,Tiger))
在這份代碼中,我們不僅可以在子類中重新建構父類的方法,還可以通過子類建立執行個體化對象,而且這種執行個體化對象既是子類的執行個體,也是父類的執行個體,這一點展現的就是變量的多态性。
還是在這份代碼中,我們建立了一個函數(test_function)用于測試對象輸出,它的參數傳遞是任意的,傳遞類的多個執行個體化對象,例如:tiger,dog,cat。
關于第三點,這裡可以做一個代碼對比,加深印象
class Book: price = '100$' def __init__(self, m): self. weight = m def location(self): self. location = 'Wuhan'book1 = Book('100kg')book2 = Book('100kg')print(book1. weight)print(book2. weight)print(book1. price)Book.price = '199'print(book1. price)print(book2. price)book1. weight = '99kg'# print(Book. weight)print(book2. weight)
我們可以看到,執行個體化對象book1在進行執行個體化的過程中直接向對象傳遞了參數,那麼比較可以得知,參數的多态性,在上一份代碼中,指的是傳入的執行個體化對象,被傳入的執行個體化對象完成自己描述自己的功能(函數功能)。
但對于多态的了解并不能止步于此,我們可以參照廖雪峰老師的文章:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017497232674368#0
先看完整代碼:
class Animal: def run(self): print('Animal is running^_^')class Cat(Animal): def run(self): print('Cat is running%__%')class Dog(Animal): def run(self): print('Dog is running.*/*/')class Stone(Animal): passdef run_twice(Animal): Animal.run() Animal.run()run_twice(Dog())c = Cat()a = Animal()print(isinstance(c, Cat))print(isinstance(c, Animal))print(isinstance(a, Cat))print(isinstance(a, Animal))
首先我們可以發現,對子類建立的執行個體化對象也是父類的一個執行個體化對象,但是反之,不成立。——歸屬
其次函數的參數是類對象,當然它也可以是一般的參數,比如數字,數值之類的,這裡展現了參數的多态 。 ——參數
仔細比較父類後面的三個子類,可以發現他們的差別在于print語句的内容,雖然可以直接繼承,但子類都對他們進行了修改。 ——屬性
綜上所述,我們可以發現,多态展現在參數,執行個體化對象歸屬以及類屬性的多樣。
1,方法重寫
2,執行個體化可以歸屬多個類
3,函數參數類型多樣
參考與引用
菜鳥教程,類重寫:https://www.runoob.com/python3/python3-class.html
廖雪峰的官方網站,繼承和多态https://www.liaoxuefeng.com/wiki/1016959663602400/1017497232674368#0
Python基礎和大資料應用 丁輝主編 2020年第一版 p86