python對象屬性管理(2):property管理屬性

使用Property管理屬性

python提供了一種友好的getter、setter、deleter類方法的屬性管理工具:property。python

property()是一個內置函數,它返回一個Property對象,它的用法很簡單,將getter、setter、deleter三個方法做爲它的參數便可,這些參數都是可選的。函數

property_obj = property(getter,setter,deleter,doc)

經過這個Property對象能夠智能地判斷是getter操做、setter操做仍是delete操做,見下面的示例。工具

惟一須要注意的是使用Property管理時,setter、deleter方法不要返回任何值,也就是說讓它返回None(這是默認的),getter方法返回所取屬性的值code

例如,對於Person的name屬性來講:對象

class Person:
    def __init__(self, name, age):
        self._name = name
        self._age = age

    def set_name(self, name): self._name = name

    def get_name(self): return self._name

    def del_name(self): del self._name

    name = property(get_name, set_name, del_name)

if __name__ == "__main__":
    p1 = Person("malongshuai", 23)

    print(p1.name)       # 自動調用get_name
    p1.name = "malong"   # 自動調用set_name
    print(p1.name)       # 自動調用get_name
    del p1.name          # 自動調用del_name
    print(p1.name)       # 自動調用get_name,將報錯

注意上面**property對象名爲name,和對象屬性"_name"是不一樣的,若是相同,則會出現無限遞歸問題**。遞歸

經過name這個property對象,就能夠智能地判斷是getter操做、setter操做仍是deleter操做。ip

property結合裝飾器也同樣方便,這正是之前版本的python所經常使用的功能。文檔

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @property       # 等價於 Name = property(Name)
    def Name(self): return self.name
    
    @Name.setter    # 等價於 Name = Name.setter(Name)
    def Name(self, name): self.name = name

    @Name.deleter   # 等價於 Name = Name.deleter(Name)
    def Name(self): del self.name

if __name__ == "__main__":
    p1 = Person("malongshuai", 23)

    print(p1.Name)       # 自動調用get_name
    p1.Name = "malong"   # 自動調用set_name
    print(p1.Name)       # 自動調用get_name
    del p1.Name          # 自動調用del_name

至於選擇使用裝飾器結合Property仍是直接使用property的內置函數,自行選擇,並無什麼區別。get

經過Property,還能夠返回計算後的值。string

class A():
    def __init__(self, value):
        self.value = value

    def two_time(self, value):
        self.value = self.value * 2

    def get_value(self):
        return self.value

    Value = property(get_value, two_time)

if __name__ == "__main__":
    a = A(23)
    print(a.Value)
    a.Value = 33
    print(a.Value)

Property對象的屬性

先看看Property的定義:

class property(object)
 |  property(fget=None, fset=None, fdel=None, doc=None)
 |
 |  Property attribute.
 |
 |    fget
 |      function to be used for getting an attribute value
 |    fset
 |      function to be used for setting an attribute value
 |    fdel
 |      function to be used for del'ing an attribute
 |    doc
 |      docstring

這些無需解釋。

再看下property的屬性:

>>> property.__dict__.keys()
dict_keys(['__getattribute__', '__get__', '__set__', '__delete__', '__init__', '__new__', 'getter', 'setter', 'deleter', 'fget', 'fset', 'fdel', '__doc__', '__isabstractmethod__'])

關注一下它的getter、setter、deleter方法,在前面property結合裝飾器的示例中已經使用到了這幾個函數。:

deleter(...)
    Descriptor to change the deleter on a property.

getter(...)
    Descriptor to change the getter on a property.

setter(...)
    Descriptor to change the setter on a property.

看方法的文檔說明是設置Property對象上的getter、setter、deleter方法,這句話結合前面的"property+裝飾器"的示例很容易理解和使用。

相關文章
相關標籤/搜索