class person(object):
definit(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('年齡必須是數字!')
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 表面上看,上面**「成功」地設定了__age變數 17,但實際上這個__age變數和class內部的__age變數不是乙個變數!
p.set_age_fun(35)
print(p.get_age_fun()) # 35
print(p.print_info()) # balala: 35
輸出:17
2035
balala: 35
表面上看,外部**「成功」地設定了__age變數 17,但實際上這個_age變數和class內部的_age變數不是乙個變數!
內部的_age變數已經被python直譯器自動改成了_person_age,而外部**給p新增了乙個_age變數。 所以呼叫 get_age_fun輸出的是初始值 20
而set_age_fun 通過class內部改變了age變數值,所以最終輸出 balala: 35
我們再稍微調整下:
(注意只改變了乙個變數名: 原來的私有屬性 __age 單下劃線為: _age,也可以定義為:age.
解釋:以乙個下劃線開頭的例項變數名,比如_age,這樣的例項變數外部是可以訪問的,但是,按照約定俗成的規定,當看到這樣的變數時,意思是,"雖然可以被訪問,但是,請視為私有變數,不要隨意訪問。")
複製**
class person(object):
definit(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('年齡必須是數字!')
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,因為此時_age是全域性變數,外部直接影響到類內部的更新值
p.set_age_fun(35)
print(p.get_age_fun()) # 35
print(p.print_info()) # balala: 35
複製**
輸出:1 17
2 17
3 35
4 balala: 35
看的出私有和全域性的設定
但是,上面的呼叫方法是不是略顯複雜,沒有直接用屬性這麼直接簡單。
有沒有可以用類似屬性這樣簡單的方式來訪問類的變數呢?必須的,對於類的方法
我們先來看乙個稍微改造的例子:(稍後我們再使用python內建的@property裝飾器就是負責把乙個方法變成屬性呼叫.)
我們進入正題:看看@property的妙用之處:
複製**
1 class person(object):
2 definit(self, name, age):
3 self.__name = name
4 self.__age = age
56 @property
7 def get_age_fun(self):
8 return self.__age
910 @get_age_fun.setter # get_age_fun是上面宣告的方法
11 def set_age_fun(self, value):
12 if not isinstance(value, int):
13 raise valueerror('年齡必須是數字!')
14 if value < 0 or value > 100:
15 raise valueerror('年齡必須是0-100')
16 self.__age = value
1718 def print_info(self):
19 print('%s: %s' % (self.__name, self.__age))
2021
22 p = person('balala',20)
23 p.__age = 17
24 print(p.__age) # 17
25 print(p.get_age_fun) # 20 注意這裡不帶()
2627 #p.set_age_fun(35) 注意不能這樣呼叫賦值了
28 p.set_age_fun = 35 # 這裡set_age_fun 就是 宣告的函式不帶()
29 print(p.get_age_fun) # 35
30 print(p.print_info()) # balala: 35
複製**
輸出:17
2035
balala: 35
python中的 property使用
如下 class animal object def init self,name,age self.name name self.age age a animal zhuzhu 9 a.name out 3 zhuzhu a.age out 4 9 a.age 20 a.age out 5 20在...
python中 property裝飾器
python中有乙個被稱為屬性函式 property 的小概念,它可以做一些有用的事情。在這篇文章中,我們將看到如何能做以下幾點 property 考察 student 類 class student object def init self,name,score self.name name se...
python 中 property的使用
從14年下半年開始接觸到python,自學了一段時間,後又跟別人學習了下,把基礎知識基本上學過了。忽然感覺python不可能這麼簡單吧,就這麼點東西?後來看了下書,發現還有很多的高階部分。連續看了兩天,把裝飾符 看了下,記錄下。裝飾符的作用就是類裡的方法變成屬性使用,比直接呼叫方法要直接簡單 直接上...