Python @property介紹
阿新 • • 發佈:2021-10-15
- 對於封裝來說:通過例項.例項屬性來訪問例項的例項屬性是不建議這麼操作的
- 正常情況下,例項的屬性應該是隱藏的,只能通過類下的例項方法來間接訪問
class Students: def __init__(self, name, age): self.__name = name self.__age = age def get_name(self): return self.__name def set_name(self,new_name): self.__name = new_name s1 = Students('周杰倫',42) print(s1.get_name()) s1.set_name('劉若英') print(s1.get_name())
-
正常情況下,當我們定義了一個class,建立了一個class的例項後,我們可以給該例項繫結任何屬性和方法,為了達到限制的目的,Python允許在定義class的時候,定義一個特殊的slots變數,來限制該class例項能新增的屬性
-
property 作用是把例項方法,變成屬性一樣呼叫,即原本是例項.方法()變成例項.屬性一樣使用;另外還可以對例項屬性進行限制,如屬性只可讀(有可讀,可寫,可刪除)
-
首先需要例項化property
class Students: def __init__(self,name): self.__name = name def get_name(self): return self.__name def set_name(self,new_name): self.__name = new_name name = property(fget=get_name,fset=set_name,doc='測試property') print(Students.name.__doc__) s1 = Students('周杰倫') print(s1.name)
-
基本格式:屬性名 = property(fget=None, fset=None, fdel=None, doc=None)
fget:用於獲取屬性的方法
fset:用於設定屬性的方法
fdel:用於刪除屬性的方法
doc:屬性的說明文件字串 -
初始化引數不是必填,不填就預設為None,填了就代表屬性具體哪些許可權
-
還有一種更簡單的方法實現上面的功能,就是直接使用裝飾器,如@property(代表只讀), @name.setter(代表可寫),@name.deleter(代表可刪除)
-
此時方法名字就需要一致(因為代表的是一個屬性,一個屬性不可能有多個名字),另外這個名字不能和類裡的其他屬性名稱一樣,否則會報錯
class Students:
def __init__(self, name):
self.__name = name
@property
def name(self):
return self.__name
@name.setter
def name(self, new_name):
self.__name = new_name
s1 = Students('周杰倫')
print(s1.name)
s1.name = 'JAY'
print(s1.name)
- 可以看出例項s1,原本(name的例項方法變成了屬性一樣的呼叫方式)