1. 程式人生 > >python中的property屬性及魔法屬性

python中的property屬性及魔法屬性

property屬性

通過以下程式碼來認識一下property

class Foo:
    def func(self):
        pass

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

可以使方法使用起來就像使用屬性一樣方便,通過裝飾器的使用實現的這種情況

  • 此屬性有兩種方式
  • 裝飾器實現
class Goods(object):

    def __init__(self):
        # 原價
        self.original_price = 100
        # 折扣
self.discount = 0.8 @property def price(self): # 實際價格 = 原價 * 折扣 new_price = self.original_price * self.discount return new_price @price.setter def price(self, value): self.original_price = value @price.deleter def price(self): del
self.original_price obj = Goods() obj.price # 獲取商品價格 obj.price = 200 # 修改商品原價 del obj.price # 刪除商品原價
  • 類屬性實現
class Foo(object):
    def get_bar(self):
        print("getter...")
        return 'wang'

    def set_bar(self, value): 
        """必須兩個引數"""
        print("setter...")
        return
'set value' + value def del_bar(self): print("deleter...") return 'wang' BAR = property(get_bar, set_bar, del_bar, "description...") obj = Foo() obj.BAR # 自動呼叫第一個引數中定義的方法:get_bar obj.BAR = "jack" # 自動呼叫第二個引數中定義的方法:set_bar方法,並將“alex”當作引數傳入 desc = Foo.BAR.__doc__ # 自動獲取第四個引數中設定的值:description... print(desc) del obj.BAR # 自動呼叫第三個引數中定義的方法:del_bar方法

以上兩種方式的setter方法中都需要有兩個引數,self指向物件,而另外一個是要接收外界使用賦值運算設定的值。
這個屬性設定的使用方式感覺很像字典的操作的使用方式,以點取值,以等號賦值

在私有屬性中的使用

class Money(object):
    def __init__(self):
        self.__money = 0

    @property
    def money(self):
        return self.__money

    @money.setter
    def money(self, value):
        self.__money = value

salary = Money()
print(salary.money)
salary.money = 20000
print(salary.money)

魔法屬性方法

__str__ 返回一個描述性資訊,必須是字串,當建立物件時,此方法就存在返回值了,在外界可以使用print(obj)檢視,也可以使用格式化字串來檢視。

__init__ 初始化例項物件,不要對其稱呼建構函式,在python中建立物件呼叫的是__new__ 方法,此方法為物件開闢記憶體空間,並返回物件的引用,之後才是init的初始化,兩者合起來倒可稱呼為建構函式

__del__ 當物件在記憶體中被釋放時,自動觸發執行

__call__ 定義此方法後,例項物件後直接加小括號就可以直接執行,執行的就是此方法內程式碼

外界可以使用(物件.屬性)進行訪問並有返回值的屬性

__module__ 檢視當前操作的物件在哪個模組中,不帶括號呼叫

__class__ 檢視物件由哪個類建立,不帶括號呼叫

__dict__ 檢視例項物件或類物件擁有的屬性和方法 ,不帶括號呼叫

__doc__ 檢視例項物件或類物件的文件描述,不帶括號呼叫

特殊的幾個方法

  • __getitem__、__setitem__、__delitem__

用於索引操作,如字典。以上分別表示獲取、設定、刪除資料,示例如下:

class Foo(object):
    def __init__(self):
        self.key = None
        self.value = None
        self.dict = dict()

    def __getitem__(self, key):
        """呼叫後可以獲得外界傳入的key"""
        # print("這裡的程式碼應該有返回值供外界檢視%s" % key)
        return self.dict[key]

    def __setitem__(self, key, value):
        self.dict[key] = value

    def __delitem__(self, key):
        del self.dict[key]


f = Foo()
f["name"] = "rose"
print(f["name"])
f["age"] = 18
print(f["age"])
del f["name"]
print(f["name"])
  • __getslice__、__setslice__、__delslice__

該三個方法用於分片操作,如:列表

class Foo(object):

    def __getslice__(self, i, j):
        print('__getslice__', i, j)

    def __setslice__(self, i, j, sequence):
        print('__setslice__', i, j)

    def __delslice__(self, i, j):
        print('__delslice__', i, j)

obj = Foo()

obj[-1:1]                   # 自動觸發執行 __getslice__
obj[0:1] = [11,22,33,44]    # 自動觸發執行 __setslice__
del obj[0:2]                # 自動觸發執行 __delslice__

以上兩類特殊的方法,看起來和property很類似,都是設定,獲取,刪除三項操作,property是通過點語法來設定和獲取,而上邊兩類是通過[]方括號來設定和獲取