**:
在寫python類的時候,雖然可以通過「例項名.變數名」的方式對例項中的變數進行讀取和賦值。但出於規範性等等原因,我們最好還是寫getter和setter,使用property() 函式和@property修飾符。
第一種方法,使用property() 函式:
class person:
def __init__(self):
self.__name= none
#這是setter方法
def setname(self,name):
self.__name=name
#這是getter方法
def getname(self ):
return self.__name
name_value=property(getname,setname) #名字可以隨便去,這裡使用name_value是為了直觀,直接用乙個n命名更簡單
p = person() #例項化
p.name_value = 'chb' #直接賦值,這行**等同於 p.setname('chb')
n = p.name_value #直接讀取資料 ,等同於使用 p.getname()
print(n) #輸出結果:chb
這種方法就是在寫好了setteer和getter後,加上一句property函式賦值**。property函式結構為property(fget=none,fset=none,fdel=none,doc=none),可以看出property可以再乙個deleter,上面**中沒有加。如果加上,deleter寫法**如下:
#這是deleter
def delname(self):
del self.__name
然後property賦值語句變為:
name_value=property(getname,setname,delname)
使用方法為:
del p.name_value
print(p.name_value) #執行會出錯
這種方法的好處是你可以按照原來的方法寫getter和setter,連getter和setter的函式名都可以不用改,只需要寫完getter和setter是加一條property賦值語句。
第二種方法,使用@property修飾符:
class person:
def __init__(self):
self.__name= none
@property #property修飾符
def name_value(self ):#這是getter,getter必須寫在setter前面,且函式名變成property修飾符名
return self.__name
@name_value.setter
def name_value(self,name):#這是setter,setteer的函式名跟getter一樣,必須為property修飾符名
self.__name=name
@name_value.deleter #這是deleter,函式名同上
def name_value(self):
del self.__name
p = person()
p.name_value = 'chb'
n = p.name_value
print(n)
del p.name_value
print(p.name_value) #這條**執行會出錯
第二種方法的getter必須寫在setter和deleter的最前面,且getter、setter、deleter使用同乙個函式名,否則會出錯。
有的時候,為了不讓修改屬性,即將屬性設定為唯讀,我們什麼可以只寫getter方法,property函式只寫第乙個引數即可。
第二種方法,詳見:
Python札記 裝飾器補充
本隨筆是對python札記 裝飾器的一些補充。使用裝飾器的時候,被裝飾函式的一些屬性會丟失,比如如下 usr bin env python def deco func print wrap start func print wrap end n deco def foo docstring for ...
補充裝飾器
1.用functools.wraps隱藏包裝函式 先實現乙個簡單的裝飾器,過濾非負引數 def decorate func def wrap args,kwargs return return wrap myfilter def test args print args is s args 可以發現...
裝飾器補充
一 通用裝飾器回顧 def inner args,kwargs 執行目標函式之前要執行的內容 ret func args,kwargs 執行目標函式之後要執行的內容 return ret return inner def target func print 我是目標函式 呼叫目標函式 二 函式的有用...