python 裝飾器 補充

2021-09-08 02:23:04 字數 2006 閱讀 1818

**:

在寫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 我是目標函式 呼叫目標函式 二 函式的有用...