(轉)Python內建函式進階之“屬性(property())”詳解
原文:https://blog.csdn.net/GeekLeee/article/details/78519767
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/GeekLeee/article/details/78519767
屬性函式(property)有以下作用:
- 將類方法轉換為只讀屬性
- 重新實現一個屬性的setter和getter方法
將類方法轉換為只讀屬性
class Person(object):
""""""
#----------------------------------------------------------------------
def __init__(self, first_name, last_name):
"""Constructor"""
self.first_name = first_name
self.last_name = last_name
#----------------------------------------------------------------------
@property
def full_name(self):
"""
Return the full name
"""
return "%s %s" % (self.first_name, self.last_name)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
以上建立了
兩個類屬性:self.first_name和self.last_name
一個full_name方法
呼叫full_name方法為person.full_name(),用@property變為person.full_name
>>> person = Person("Mike", "Driscoll")
>>> person.full_name
'Mike Driscoll'
>>> person.first_name
'Mike'
>>> person.full_name = "Jackalope"
Traceback (most recent call last):
File "<string>", line 1, in <fragment>
AttributeError: can't set attribute
1
2
3
4
5
6
7
8
9
10
但他只具有隻讀屬性,不能更改
Python進階之“屬性(property)”詳解
Python 中的 property 屬性
兩個等同的程式碼:
class Foo:
def __init__(self,val):
self.__NAME=val #將所有的資料屬性都隱藏起來
@property #get
def name(self):
return self.__NAME #obj.name訪問的是self.__NAME(這也是真實值的存放位置)
@name.setter #set
def name(self,value):
if not isinstance(value,str): #在設定值之前進行型別檢查
raise TypeError('%s must be str' %value)
self.__NAME=value #通過型別檢查後,將值value存放到真實的位置self.__NAME
@name.deleter #delete
def name(self):
raise TypeError('Can not delete')
f=Foo('egon')
print(f.name)
# f.name=10 #丟擲異常'TypeError: 10 must be str'
del f.name #丟擲異常'TypeError: Can not delete'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Foo:
def __init__(self,val):
self.__NAME=val #將所有的資料屬性都隱藏起來
def getname(self): #get
return self.__NAME #obj.name訪問的是self.__NAME(這也是真實值的存放位置)
def setname(self,value): #set
if not isinstance(value,str): #在設定值之前進行型別檢查
raise TypeError('%s must be str' %value)
self.__NAME=value #通過型別檢查後,將值value存放到真實的位置self.__NAME
def delname(self): #delete
raise TypeError('Can not delete')
name=property(getname,setname,delname) #最後把方法變成屬性
#一種property的古老用法
---------------------
作者:GeekLeee
來源:CSDN
原文:https://blog.csdn.net/GeekLeee/article/details/78519767
版權宣告:本文為博主原創文章,轉載請附上博文連結!