面向對象封裝特點之一就是通過實現好的方法來訪問,限制對數據的不合理訪問,把對象狀態私有化,僅供類的內部進行操作 下方示例,Test方法的number屬性類實例的時候傳遞1,number是一個公開屬性,可以在外部任意修改、訪問,沒有對屬性進行進行約束 class Test: def __init__( ...
面向對象封裝特點之一就是通過實現好的方法來訪問,限制對數據的不合理訪問,把對象狀態私有化,僅供類的內部進行操作
下方示例,Test方法的number屬性類實例的時候傳遞1,number是一個公開屬性,可以在外部任意修改、訪問,沒有對屬性進行進行約束
class Test:
def __init__(self,number)
self.number = number
if __name__ == '__main__':
test = Test(1)
print(test.number)
test.number = -100
print(test.number)
@property
@property的作用是聲明一個只讀屬性,在函數上裝飾,像調用屬性一樣的去調用這個函數,對象.屬性的方式操作,內部可以做一些邏輯判斷,需要註意的兩點
- 調用被裝飾方法的時候不+括弧
- 方法定義有且只能有self一個參數
class Test:
def __init__(self, number):
self.__number = number
@property # 聲明number屬性,只讀
def number(self):
if self.__number >= 100:
raise ValueError('範圍超出100')
return self.__number
if __name__ == '__main__':
test = Test(3)
print(test.number) # 3
@func.setter
setter就是給@property聲明的屬性設置值,func是當前函數的名字,但是當前函數setter,又需要指向property,所以property聲明的函數名 和 setter的函數名需要一致,根據賦值操作還是獲取操作決定走哪個方法
class Test:
def __init__(self,number):
self.__number = None
@property # 聲明屬性
def number(self):
if self.__number >= 100:
raise ValueError('範圍超出100')
return self.__number
@number.setter # 設置屬性
def number(self,number)
self.__number = number
'''
聲明和設置屬性的函數名字可以完全自定義,但是要與初始化變數名做區分,如果都一樣的話會出現同名遞歸報錯
'''
test = Test()
test.number = 30 # setter 設置值
print(test.number) #property聲明的number獲取值
@func.deleter
deleter裝飾器見名知意,就是屬性的刪除操作,實際開發過程中,具體實現的邏輯由我們自己實現,當del屬性的時候,會觸發該裝飾器函數內的流程,但是是否是刪除操作,根據業務場景來實現
class Test:
def __init__(self):
self.__number = None
@property
def number(self):
return self.__number
@number.setter
def number(self, number):
self.__number = number
@number.deleter
def number(self):
self.__number = 100
if __name__ == '__main__':
test = Test()
test.number = 10
print(test.number) # 10
del test.number
print(test.number) # 100
'''
該示例中,deleter的方法中將number設置為了100,
del test.number後觸發該流程,所以在deleter做什麼事情,由自己決定,
可以是 del self.__number 也可有是self.__number=None等等,del只是觸發條件
'''
property(fget,fset)
除了上面使用裝飾器聲明,還可有在類中設置屬性指向property()對象,設置set和get的方法以及del方法
class Test:
def __init__(self):
self.__number = None
def get_number(self):
return self.__number
def set_number(self, number):
self.__number = number
def del_number(self):
del self.__number
# 設置number屬性指向property對象
# fget 獲取的時候觸發的方法
# fset 賦值的時候觸發的方法
# fdel 刪除的時候觸發的方法
number = property(fget=get_number, fset=set_number, fdel=del_number)
if __name__ == '__main__':
test = Test()
test.number = 100
print(test.number)
del test.number
風月都好看,人間也浪漫.