1.什麼是property屬性

一種用起來像是使用的例項屬性一樣的特殊屬性,可以對應於某個方法
class Foo:

    def func(self):
        pass

    # 定義property屬性
    @property
    def prop(self):
        pass


"""呼叫"""
foo_obj = Foo()
foo_obj.func()  # 呼叫例項方法
foo_obj.prop  # 呼叫property屬性

2.property屬性的呼叫需要注意以下幾點

  • 定義時,在例項方法的基礎上新增@property裝飾器,並且僅有一個self引數
  • 呼叫時,不需要新增()

3.property屬性的兩種方式

  • 裝飾器,即在方法上使用裝飾器
  • 類屬性,即在類中定義值為property物件的類屬性

3.1 裝飾器方式

在類的例項方法上應用@property裝飾器
Python中的類有經典類和新式類,新式類的屬性比經典類的屬性豐富。( 如果類繼object,那麼該類是新式類 )
Python 2.x中預設都是經典類,只有顯式繼承了object才是新式類
Python 3.x中預設都是新式類,不必顯式的繼承object

經典類,具有一種@property裝飾器

class Goods:

    # 定義property 屬性
    @property
    def price(self):
        return "zhaosi"
"""呼叫"""
obj = Goods()
result = obj.price  # 自動執行 @property 修飾的 price 方法,並獲取方法的返回值
print(result)

新式類,具有三種@property裝飾器

class Goods:
    """python3中預設繼承object類
        以python2、3執行此程式的結果不同,因為只有在python3中才有@xxx.setter  @xxx.deleter
    """
    @property
    def price(self):
        print('@property')

    @price.setter
    def price(self, value):
        print('@price.setter')

    @price.deleter
    def price(self):
        print('@price.deleter')

"""呼叫"""
obj = Goods()
obj.price          # 自動執行 @property 修飾的 price 方法,並獲取方法的返回值
obj.price = 123    # 自動執行 @price.setter 修飾的 price 方法,並將  123 賦值給方法的引數
del obj.price      # 自動執行 @price.deleter 修飾的 price 方法

由於新式類中具有三種訪問方式,我們可以根據它們幾個屬性的訪問特點,分別將三個方法定義為對同一個屬性:獲取、修改、刪除

3.2 類屬性方式,建立值為property物件的類屬性

當使用類屬性的方式建立property屬性時,經典類和新式類無區別
class Foo:
    def get_bar(self):
        return 'zhaosi'

    BAR = property(get_bar)

obj = Foo()
reuslt = obj.BAR  # 自動呼叫get_bar方法,並獲取方法的返回值
print(reuslt)

property方法中有個四個引數

  • 第一個引數是方法名,呼叫 物件.屬性 時自動觸發執行方法
  • 第二個引數是方法名,呼叫 物件.屬性 = XXX 時自動觸發執行方法
  • 第三個引數是方法名,呼叫 del 物件.屬性 時自動觸發執行方法
  • 第四個引數是字串,呼叫 物件.屬性.doc ,此引數是該屬性的描述資訊
class Foo(object):
    def get_bar(self):
        print("getter...")
        return 'zhaosi'

    def set_bar(self, value): 
        """必須兩個引數"""
        print("setter...")
        return 'set value' + value

    def del_bar(self):
        print("deleter...")
        return 'zhaosi'

    BAR = property(get_bar, set_bar, del_bar, "description...")

obj = Foo()

obj.BAR  # 自動呼叫第一個引數中定義的方法:get_bar
obj.BAR = "alex"  # 自動呼叫第二個引數中定義的方法:set_bar方法,並將“alex”當作引數傳入
desc = Foo.BAR.__doc__  # 自動獲取第四個引數中設定的值:description...
print(desc)
del obj.BAR  # 自動呼叫第三個引數中定義的方法:del_bar方法

由於類屬性方式建立property屬性具有3種訪問方式,我們可以根據它們幾個屬性的訪問特點,分別將三個方法定義為對同一個屬性:獲取、修改、刪除