1. 程式人生 > 實用技巧 >python基礎-面向物件(八)多型,封裝

python基礎-面向物件(八)多型,封裝

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