python中的property屬性及魔法屬性
阿新 • • 發佈:2019-02-03
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是通過點語法來設定和獲取,而上邊兩類是通過[]方括號來設定和獲取