Property的概念:property是一種特殊的屬性,訪問它時會執行一段功能(函數),然后返回值。
import mathclass Circle:def __init__(self,radius):#園的半徑radiusself.radius=radius@property#area=property(area)def area(self):return math.pi*self.radius**2#計算面積@propertydef perimeter(self):return 2*math.pi*self.radius#計算周長c=Circle(5)print(c.radius)# print(c.area())# print(c.perimeter())print(c.area)#函數前添加裝飾器后,調用時不加括號就可以運行print(c.perimeter)
?
為什么要用property
將一個類的函數定義成特性以后,對象再去使用的時候obj,name根本無法察覺自己的name是執行了一個函數然后計算出來的,這種特性的使用方式遵循了統一訪問的原則
除此之外:
面向對象的封裝有三種方式:
【public】
這種其實就是不封裝,是對外公開的
【protected】
這種封裝方式對外不公開,但對朋友或者子類公開
【private】
這種封裝對誰都不公開
Python并沒有在語法上把他們三個內建到自己的CLASS機制中,在C++里一般會將所有的數據設置為私有的,然后提供set和get方法去設置和獲取,在Python中通過property方法可以實現
?
class Foo:def __init__(self,val):self.__NAME=val #將所有的數據屬性都隱藏起來@propertydef name(self):return self.__NAME #obj.name訪問的是self.__NAME(這也是真實值的存放位置)@name.setterdef name(self,value):if not isinstance(value,str): #在設定值之前進行類型檢查raise TypeError('%s must be str' %value)self.__NAME=value #通過類型檢查后,將值value存放到真實的位置self.__NAME@name.deleterdef name(self):raise TypeError('Can not delete')f=Foo('egon')print(f.name)# f.name=10 #拋出異常'TypeError: 10 must be str'del f.name #拋出異常'TypeError: Can not delete'