1、對多態的理解:多態和繼承不分家,多態實際上是依附於繼承的兩種含義的,“改變”和”擴展“,多態就是繼承的兩層含義的一個具體實現機制。即:調用不同的類實例化對象下的相同方法,實現的過程不一樣。
多態的具實例:以水的三種形態爲例
class H2O:
def __init__(self,name,temperature):
self.name=name
self.temperature=temperature
def turn_ice(self):
if self.temperature<0:
print("%s溫度太低結冰了"%self.name)
elif self.temperature>0 and self.temperature<100 :
print("%s液化成水"%self.name)
elif self.temperature<0:
print("%s溫度太高變成了水蒸氣"%self.name)
class Water(H2O):
pass
class Ice(H2O):
pass
class Stream(H2O):
pass
a=Water("水",28)
b=Ice("冰",-20)
c=Steam("蒸汽",2000)
2、封裝:封裝的意義在於隱藏,”封”指的封閉,“裝”指的是把東西裝進去,類的屬性就好比東西,類就相當於封裝東西的容器。
3、封裝的三種層面:
(1)第一個層面:類就是一個麻袋,本身就是封裝
(2)第二個層面:類中定義私有屬性,只在內部使用,外部無法訪問,這裏要說到python中的兩個約定(僅僅是約定而已,不做強行限制)
- 類中屬性以單下劃線"_"開頭的,就是被隱藏起來的,但是外部還是可以調用的,python中的約定沒有那麼嚴格
- 類中屬性以兩個單下劃線“__”開頭的,外部調用會將其屬性名改變。如__test=“123”,外部調用需要更名纔可以訪問到,名稱格式爲"_類名__test",可以用print(類名.dict)打印出來查看
(3)第三個層面(真正意義上的封裝):只能內部訪問,外部不能訪問。可以寫一個內部方法(接口函數),然後通過外部調用該方法執行
class test:
_a="hahaha"
def __init__(self,name,age):
self.name=name
self.age=age
#接口函數
def get_a(self):
print(_a)
p=test("Mary",18)
p.get_a()
#輸出結果:hahaha