Python 中 property的用法

2022-04-28 16:09:09 字數 3324 閱讀 8334

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不可能這麼簡單吧,就這麼點東西?後來看了下書,發現還有很多的高階部分。連續看了兩天,把裝飾符 看了下,記錄下。裝飾符的作用就是類裡的方法變成屬性使用,比直接呼叫方法要直接簡單 直接上...