1. 程式人生 > 實用技巧 >你關注的房子降價了嗎?Python分析下北京的二手房資料

你關注的房子降價了嗎?Python分析下北京的二手房資料

類的多型性

一:多型與多型性

多型指的是同一種事物有多種狀態,比如動物的多種形態:貓,狗,豬,雞。

class Animal: #同一類事物:動物
    def talk(self):
        pass
class Cat(Animal): #動物的形態之一:貓
    def talk(self):
        print('喵喵喵')
class Dog(Animal): #動物的形態之二:狗
    def talk(self):
        print('汪汪汪')
class Pig(Animal): #動物的形態之三:豬
    def talk(self):
        print('哼哼哼')

#例項化得到三個物件
>>> cat=Cat()
>>> dog=Dog()
>>> pig=Pig()

多型性指的是可以在不用考慮物件具體型別的情況下而直接使用物件,這就需要在設計時,把物件的使用方法統一成一種:例如cat、dog、pig都是動物,但凡是動物肯定有talk方法,於是我們可以不用考慮它們三者的具體是什麼型別的動物,而直接使用

cat.talk()  # 喵喵
dog.talk()  # 旺旺
pig.talk()  # 哼哼

定義一個統一的介面來進行訪問

def Talk(animal):
    animal.talk()

Talk(cat) # 喵喵
Talk(dog) # 旺旺
Talk(pig) # 哼哼

在pyton中一切皆物件,本身就是支援多型性

# 我們可以在不考慮三者型別的情況下直接使用統計三個物件的長度
str.__len__()
list.__len__()
tuple.__len__()


# Python內建了一個統一的介面
len(str)
len(list)
len(tuple)

多型性的好處在於增強了程式的靈活性和擴充套件性,比如通過繼承Animal類建立了一個新的類,例項化得到的物件obj,可以使用相同方式使用obj.talk()

class Dog(Animal): # 動物豬
	def talk(self):
        print('哼哼哼哼')
        
dog = Dog() # 例項一頭豬
dog.talk() # 使用者根本無需關心wolf是什麼型別而呼叫talk

多型性的本質就是,在於不同的類中定義相同的方法名,這樣我們就可以不考慮類,而統一使用一種方式使用物件,可以通過父類引入抽象類的概念來硬性規定限制子類,必須通過某些方法

import abc
# 指定metaclass屬性將類設定為抽象類,抽象類本身只是用來約束子類的,不能被例項化
class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod # 該裝飾器限制子類必須定義有一個名為talk的方法
    def talk(self): # 抽象方法中無需實現具體的功能
        pass

class Cat(Animal): # 但凡繼承Animal的子類都必須遵循Animal規定的標準
    def talk(self):
        pass

cat=Cat() # 若子類中沒有一個名為talk的方法則會丟擲異常TypeError,無法例項化

但其實我們完全可以不依賴於繼承,只需要製造出外觀和行為相同物件,同樣可以實現不考慮物件型別而使用物件,這正是Python崇尚的“鴨子型別”(duck typing):“如果看起來像、叫聲像而且走起路來像鴨子,那麼它就是鴨子”。比起繼承的方式,鴨子型別在某種程度上實現了程式的鬆耦合度,如下

#二者看起來都像檔案,因而就可以當檔案一樣去用,然而它們並沒有直接的關係
class Txt: #Txt類有兩個與檔案型別同名的方法,即read和write
    def read(self):
        pass
    def write(self):
        pass

class Disk: #Disk類也有兩個與檔案型別同名的方法:read和write
    def read(self):
        pass
    def write(self):
        pass