1. 程式人生 > 實用技巧 >三大特徵--多型

三大特徵--多型

多型

設計角度講:

    定義:父類的同一種動作或者行為,在不同的子類上有不同的實現。

    作用: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, ""
) # <__main__.Person object at 0x7f5ea31cde10> print(ak) # 直接列印自定義物件 # 本質: # 1. 呼叫自定義物件的__str__ content = ak.__str__() # 2. 顯示返回的字串 print(content)
View Code

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