python基礎-面向物件(八)多型,封裝
阿新 • • 發佈:2020-12-13
1.多型:通過繼承父類後,子類有了共有的父類的方法,當執行該方法時,可能效果不同,比如,水在不同溫度下有不同的形態:冰,水蒸氣,霧,他們在執行相同函式時候,效果不同
class H2o: def __init__(self, name, temperature): self.name = name self.temperature = temperature def chang(self): if self.temperature < 0: print('%s的溫度太低了,結冰了' % self.name)elif self.temperature > 0 and self.temperature < 100: print('%s變成水了' % self.name) elif self.temperature > 100: print('%s變成水蒸氣了' % self.name) class Water(H2o): pass class Gas(H2o): pass class Ice(H2o): pass w1 = Water('水', -5) w1.chang() g1 = Gas('水蒸氣', 90) g1.chang() i1 = Ice('冰', 20) i1.chang()
2.封裝:
說法一:類就是封裝,外部import類的時候,並不知道類裡面是怎麼執行的。所以是封裝。
說法二:單下劃線或雙下劃線的方法就是私有的,這是封裝。
class School: def __init__(self, name): self.name = name def _get_name(self): print('學校的名字是%s' % self.name) school = School('清華') school._get_name()# 單下劃線是可以呼叫的,只是大家約定是私有屬性
class School: def __init__(self, name): self.name = name def __get_name(self): print('學校的名字是%s' % self.name) school = School('清華') print(School.__dict__) school._School__get_name() # 雙下劃線不能直接呼叫的,python把__get_name重新命名為_School__get_name了,還是可以呼叫
在繼承中,父類如果不想讓子類覆蓋自己的方法,可以將方法定義為私有的,雙下劃線。
說法三:封裝是為了區分內外,內部屬性不給外部看,但是需要給外部留出呼叫的介面
class H2o: def __init__(self, name, temperature): self.name = name self.__temperature = temperature #注意,沒事不要輕易用隱藏屬性,否則後期要開很多介面 def get_temperature(self): return self.__temperature w1 = H2o('水', 10) print(w1.get_temperature())