三大特徵--多型
阿新 • • 發佈:2020-09-19
多型
設計角度講:
定義:父類的同一種動作或者行為,在不同的子類上有不同的實現。
作用:1.在繼承的基礎上,體現型別的個性化。
2.增強程式擴充套件性,體現開閉原則。
重寫:
子類實現了父類中相同的方法(方法名、引數)。
在呼叫該方法時,實際執行的是子類的方法。
快捷鍵(ctrl + O)
內建可重寫函式:
python中,以雙下劃線開頭、雙下劃線結尾的是系統定義的成員。我們可以在自定義類中進行重寫,從而改變其行為。
轉換字串
__str__函式:將物件轉換為字串
運算子過載
定義:讓自定義的類生成的物件(例項)能夠使用運算子進行操作。
算術運算子
複合運算子過載
比較運算子過載
__str__
class Person(object): def __init__(self, name="", age=0, sex=""): self.name = name self.age = age self.sex = sex def __str__(self): return f"我叫{self.name},今年{self.age}歲,性別{self.sex}." ak = Person("安康", 26, "男"View Code) # <__main__.Person object at 0x7f5ea31cde10> print(ak) # 直接列印自定義物件 # 本質: # 1. 呼叫自定義物件的__str__ content = ak.__str__() # 2. 顯示返回的字串 print(content)
__add__
class Vector2: """ 二維向量 """ def __init__(self, x, y): self.x = x self.y = y def __str__(self): return "x分量:%d,y分量%d" % (self.x, self.y) def __add__(self, other): x = self.x + other.x y = self.y + other.y return Vector2(x, y) pos01 = Vector2(1, 2) pos02 = Vector2(3, 4) print(pos01 + pos02) # pos01.__add__(pos02)
運算子過載
+=
對於可變物件,+=應該在原物件基礎上改變
對於不可變物件,+=應該建立新物件
class Vector2: def __init__(self, x, y): self.x = x self.y = y def __str__(self): return "x分量:%d,y分量%d" % (self.x, self.y) # + # def __add__(self, other): # x = self.x + other.x # y = self.y + other.y # return Vector2(x, y) # += def __iadd__(self, other): self.x += other.x self.y += other.y return self # 返回原有資料 pos01 = Vector2(1, 2) pos02 = Vector2(3, 4) print(id(pos01)) pos01 += pos02 print(id(pos01)) print(pos01) list01 = [1] # print(id(list01)) list01 += [2] # print(id(list01)) print(list01) # [1,2] 在原有列表基礎上新增 tuple01 = (1,) tuple01 += (2,) print(tuple01) # (1,2) 產生新容器
__eq__ 和 __lt__
class Commodity: def __init__(self, cid=0, name="", price=0): self.cid = cid self.name = name self.price = price # 比較是否相同的判斷標準: def __eq__(self, other): return self.cid == other.cid # 比較是否大小的判斷標準: def __lt__(self, other): return self.price < other.price list_commodity_infos = [ Commodity(1001, "屠龍刀", 10000), Commodity(1002, "倚天劍", 10000), Commodity(1003, "金箍棒", 52100), Commodity(1004, "口罩", 20), Commodity(1005, "酒精", 30), ] c01 = Commodity(1001, "屠龍刀", 10000) c02 = Commodity(1001, "屠龍刀", 20000) # 以下內建函式,需要自定義類重寫__eq__ print(c01 == c02) # true # count 判斷列表中儲存在元素數量 print(list_commodity_infos.count(c01)) # print(list_commodity_infos.remove(c01)) print(c01 in list_commodity_infos) # 以下內建函式,需要自定義類重寫__lt__ # list_commodity_infos.sort() # print(list_commodity_infos) min_commodity = min(list_commodity_infos) print(min_commodity.__dict__)
"""
老張開車去東北
需求變化:飛機、船、小黃車...
封裝:分
人 車
繼承:隔
多型
缺點:違反面向物件設計原則 - 開閉
允許增加新功能,不允許修改客戶端程式碼
"""
class Person: def __init__(self, name=""): self.name = name def go_to(self, vehicle): print("去...") # 如果是汽車 if type(vehicle) == Car: vehicle.run() # 否則如果是飛機 elif type(vehicle) == Airplane: vehicle.fly() class Car: def run(self): print("汽車行駛") class Airplane: def fly(self): print("嗖嗖嗖") zl = Person("老張") bm = Car() fj = Airplane() zl.go_to(bm)
"""
老張開車去東北
需求變化:飛機、船、小黃車...
封裝:分
人 車
繼承:隔
交通工具
多型:做
完成汽車、飛機等具體交通工具的邏輯實現
"""
class Person: def __init__(self, name=""): self.name = name def go_to(self, vehicle): print("去...") # 如果傳入的是交通工具 if isinstance(vehicle, Vehicle): # 先確定呼叫方法 # 編碼時呼叫的父類 # 執行時執行的子類 vehicle.transport() class Vehicle: def transport(self): pass class Car(Vehicle): def transport(self): print("滴滴滴") class Airplane(Vehicle): def transport(self): print("嗖嗖嗖") zl = Person("老張") bm = Car() fj = Airplane() zl.go_to(bm)