1. 程式人生 > 其它 >python面向物件(封裝、繼承、多型)

python面向物件(封裝、繼承、多型)

技術標籤:python面向物件程式設計封裝多型

面向物件

封裝

定義類

class Person:

定義屬性(類屬性):可以用類或物件呼叫
語法:類名.變數名=變數值

name = "張三"

構造方法:初始化方法

    def __init__(self,age,gender):
        #在初始化方法中給物件新增屬性
        self.age = age
        self.gender = gender

定義方法
該預設的引數self指的是呼叫該函式的物件

    def eat(self):
        print("123")
        # print(self)

例項化物件

person = Person

呼叫屬性

print(person.name)

修改類屬性的值
如果通過物件對屬性進行重新賦值,實際上是給該物件又重新定義了一個屬性名一樣的變數

person.name = "李四"  #該方法不能修改類屬性的值
print(person.name)
print(Person.name)

在這裡插入圖片描述

Person.name = "李四"
print(person.name)
print(Person.name)

在這裡插入圖片描述
呼叫函式

person.eat()

在這裡插入圖片描述
新增物件屬性
類外面新增:該屬性只能被當前物件使用

person.age = 22
print(person.age)

在這裡插入圖片描述
類裡面新增物件屬性 語法: 變數名 = 變數值
該種方式新增的屬性,屬於所有類物件的

name = "張三"

在__init__()方法中新增物件屬性 語法:self.屬性名 = 值
用在__init__()初始化方法中

    def __init__(self,age,gender):
        #在初始化方法中給物件新增屬性
        self.age = age
        self.gender = gender

私有屬性和私有方法
設定私有屬性和方法 在屬性名和方法名前面加兩個下劃線__
定義為私有屬性和私有方法,不能被子類繼承

__cardPass = "123456"

獲取和修改私有屬性的值
獲取 定義getXXX()

    def getCardPass(self):
        return self.__cardPass

修改 定義setXX()

    def setCardPass(self,cardPass):
        self.__cardPass = cardPass

在這裡插入圖片描述

方法
類方法
用裝飾器@classmethod標識

@classmethod
    def sleep(cls):
        print("睡覺")

呼叫類方法

person.sleep()
Person.sleep()

在這裡插入圖片描述
新增屬性

@classmethod
    def sleep(cls):
        print(f"{cls.name}睡覺")

在這裡插入圖片描述

靜態方法
用裝飾器@staticmethod標識
不能傳參

@staticmethod
    def play():
        print("打豆豆")

呼叫靜態方法

Person.play()
person.play()

在這裡插入圖片描述
魔法方法
XX()函式叫做魔法方法,指的是具有特殊功能的函式
init()
init():初始化物件
在建立一個物件時預設被呼叫,不需要手動呼叫
帶引數的__init__()方法
類似Java語言中的構造方法
str()
print輸出物件時,預設列印的是物件在記憶體中的地址
如果類中定義__str__方法,則會列印__str__方法中的內容
類似Java語言中的toString()方法

    def __str__(self):
        return f"{self.name},{self.age}"
print(person)

在這裡插入圖片描述

繼承

單繼承
父類
class 父類(object):
在Python中,所有類預設繼承object類

class Father(object):
    money = 2222.22

	def cook(self):
        print("做飯")

子類
class 子類(父類):

class Son(Father):
    pass
son = Son()
print(son.money)
son.cook()

在這裡插入圖片描述

多繼承
子類
class 子類(父類1,父類2)
如果一個類繼承多個父類,優先繼承父類1的同名屬性和方法

class Son(Father,Mother):
    pass

父類

class Father(object):
    money = 2222.22

    def hair(self):
        print("頭髮")

    def eat(self):
        print("吃")

class Mother(object):
    money = 8888.88

    def eye(self):
        print("眼睛")

    def play(self):
        print("玩")

呼叫

son = Son()
print(son.money)
son.hair()
son.play()

在這裡插入圖片描述

檢視一個類的繼承關係
類.mro
子類重寫父類的同名屬性和方法
如果子類重寫了父類的同名屬性和方法,則會呼叫子類中的同名屬性和方法

print(Son.__mro__)

在這裡插入圖片描述

子類呼叫父類的同名屬性和方法
在子類的同名方法中呼叫語法
父類類名.方法(self)
super()
呼叫父類方法
super().方法()
適用於 單繼承
父類

class Father(object):
    money = 2222.22

    def play(self):
        print("玩遊戲")

子類

class Son(Father,Mother):
    money = 22.22

    def play(self):
        print("玩手機遊戲")

呼叫

son = Son()
print(son.money)
son.play()

在這裡插入圖片描述
呼叫父類的方法

    def play(self):
        Father.play(self)
        print("玩手機遊戲")

在這裡插入圖片描述
多型
概念:多型是一種使用物件的方式,子類重寫父類方法,呼叫不同子類物件的相同父類方法,可以產生不同的執行效果
步驟
定義父類,提供父類方法

class Water(object):
    def use(self):
        pass

定義子類,重寫父類方法

class Gas(Water):
    def use(self):
        print("這是氣體的水")



class Liquid(Water):
    def use(self):
        print("這是液體的水")



class Solid(Water):
    def use(self):
        print("這是固體的水")

傳遞子類物件給呼叫者,返回不同的結果

class Person(object):
    def cook(self,water):
        water.use()

呼叫

person = Person()
gas = Gas()
person.cook(gas)

在這裡插入圖片描述

person = Person()
liquid = Liquid()
person.cook(liquid)

在這裡插入圖片描述

person = Person()
solid = Solid()
person.cook(solid)

在這裡插入圖片描述