面向物件封裝特點之一就是通過實作好的方法來訪問,限制對資料的不合理訪問,把物件狀態私有化,僅供類的內部進行操作
下方示例,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
風月都好看,人間也浪漫.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/549733.html
標籤:其他
上一篇:JVM:并發的可達性分析
