以下內(nèi)容來自萬能的互聯(lián)網(wǎng)...
首先教材上的
@property 可以將一個(gè)方法的調(diào)用變成“屬性調(diào)用”紊服,主要用于幫助我們處理屬性的都操作和寫操作,對(duì)于某一個(gè)對(duì)象划乖,可以直接通過:a.salary = 3000族檬。
下面是網(wǎng)上的,講的比較詳細(xì)了拄丰,如果用紙畫畫內(nèi)存圖可能會(huì)更清晰。
在綁定屬性時(shí),如果我們直接把屬性賦值給對(duì)象戈鲁,比如:
p = Person()
p.name= 'Mary'
我們先看個(gè)詳細(xì)的例子(注意雙下劃線name和age定義為私有變量):
class Person(object):
def __init__(self, name, age):
self.__name = name
self.__age = age
def get_age_fun(self):
return self.__age
def set_age_fun(self, value):
if not isinstance(value, int):
raise ValueError('年齡必須是數(shù)字!')
if value < 0 or value > 100:
raise ValueError('年齡必須是0-100')
self.__age = value
def print_info(self):
print('%s: %s' % (self.__name, self.__age))
p = Person('balala',20)
p.__age = 17
print(p.__age) # 17
print(p.get_age_fun()) # 20
表面上看,上面代碼“成功”地設(shè)置了__age變量 17,但實(shí)際上這個(gè)__age變量和class內(nèi)部的__age變量不是一個(gè)變量嘹叫! 內(nèi)部的__age變量已經(jīng)被Python解釋器自動(dòng)改成了_Person__age婆殿,而外部代碼給p新增了一個(gè)__age變量。 所以調(diào)用 get_age_fun輸出的是初始值
p.set_age_fun(35)
print(p.get_age_fun()) # 35
print(p.print_info()) # balala: 35
我們?cè)偕晕⒄{(diào)整下:
(注意只改變了一個(gè)變量名: 原來的私有屬性 __age 單下劃線為: _age,也可以定義為:age. 解釋:以一個(gè)下劃線開頭的實(shí)例變量名罩扇,比如_age婆芦,這樣的實(shí)例變量外部是可以訪問的,但是喂饥,按照約定俗成的規(guī)定消约,當(dāng)看到這樣的變量時(shí),意思是员帮,"雖然可以被訪問或粮,但是,請(qǐng)視為私有變量捞高,不要隨意訪問氯材。")
class Person(object):
def __init__(self, name, age):
self.__name = name
self._age = age
def get_age_fun(self):
return self._age
def set_age_fun(self, value):
if not isinstance(value, int):
raise ValueError('年齡必須是數(shù)字!')
if value < 0 or value > 100:
raise ValueError('年齡必須是0-100')
self._age = value
def print_info(self):
print('%s: %s' % (self.__name, self._age))
p = Person('balala',20)
p._age = 17
print(p._age) # 17
print(p.get_age_fun()) # 這里是17 不再是 20,因?yàn)榇藭r(shí)_age是全局變量,外部直接影響到類內(nèi)部的更新值
p.set_age_fun(35)
print(p.get_age_fun()) # 35
print(p.print_info()) # balala: 35
看的出私有和全局的設(shè)置,但是硝岗,上面的調(diào)用方法是不是略顯復(fù)雜氢哮,沒有直接用屬性這么直接簡(jiǎn)單。有沒有可以用類似屬性這樣簡(jiǎn)單的方式來訪問類的變量呢型檀?必須的冗尤,對(duì)于類的方法我們先來看一個(gè)稍微改造的例子:
(稍后我們?cè)偈褂肞ython內(nèi)置的@property裝飾器就是負(fù)責(zé)把一個(gè)方法變成屬性調(diào)用.)
我們進(jìn)入正題:看看@property的妙用之處:
class Person(object):
def __init__(self, name, age):
self.__name = name
self.__age = age
@property
def get_age_fun(self):
return self.__age
@get_age_fun.setter # get_age_fun是上面聲明的方法
def set_age_fun(self, value):
if not isinstance(value, int):
raise ValueError('年齡必須是數(shù)字!')
if value < 0 or value > 100:
raise ValueError('年齡必須是0-100')
self.__age = value
def print_info(self):
print('%s: %s' % (self.__name, self.__age))
p = Person('balala',20)
p.__age = 17
print(p.__age) # 17
print(p.get_age_fun) # 20 注意這里不帶()
#p.set_age_fun(35) 注意不能這樣調(diào)用賦值了
p.set_age_fun = 35 # 這里set_age_fun 就是 聲明的函數(shù)不帶()
print(p.get_age_fun) # 35
print(p.print_info()) # balala: 35
參考文章