Python屬性使用@property和不使用@property的差別
轉載自:https://blog.csdn.net/u013821237/article/details/84673712
首先看下屬性的分類:
1:實例屬性:
最好在__init__(self,…)中初始化
內部調用時都需要加上self.
外部調用時用instancename.propertyname
2:類屬性:
在__init__()外初始化
在內部用classname.類屬性名調用
外部既可以用classname.類屬性名又可以用instancename.類屬性名來調用
3:私有屬性:
1):單下劃線_開頭:只是告訴別人這是私有屬性,外部依然可以訪問更改
2):雙下劃線__開頭:外部不可通過instancename.propertyname來訪問或者更改
實際將其轉化爲了_classname__propertyname
正常情況下,我們對屬性賦值,直接賦值就可以了:
class People(object):
def __init__(self, name, age):
self.name = name
self.age = age
p1 = People('張三', 22)
p1.name='李四'
print(p1.name)
++++++++++++++++++++++result++++++++++++++++++++++++
李四
但是如果我們對所賦的值有一定的限制,比如要求名字必須是字符串,年齡必須是數字,否則會對方法的調用造成影響,這個時候單純的賦值就不能滿足這樣的過濾效果了。既然是條件過濾,那麼這幾條代碼就需要放在方法裏,所以就有了setName(),getName()這樣的方法,在set方法裏做條件限制,使用的時候是這樣的:
p1 = People('張三', 22)
p1.set('李四')
print(p1.getName());
這樣其實已經可以了,很滿足功能需要。而用@property是讓這個更簡潔,既保持直接對屬性賦值的方便,又對條件做了限制:
@property
def name(self):
a = self._name
#返回前還可以對數據做處理,比如格式化等
return a
@name.setter
def name(self,value):
#在賦值之前添加判斷
if not isinstance(value,str):
# 拋出異常
raise TypeError('People object.name,name must be a str!')
self._name = value
#調用的時候仍然是方便快捷的直接賦值:
p1 = People('張三', 22);
p1.name='李四'
print(p1.name)
++++++++++++++++++++++result++++++++++++++++++++++++
李四
總之,@property就是既擁有set、get方法的靈活性,又具有屬性直接賦值取值的簡便性。