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)