Python屬性使用@property和不使用@property的差別

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方法的靈活性,又具有屬性直接賦值取值的簡便性。

發佈了7 篇原創文章 · 獲贊 5 · 訪問量 437
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章