【python 10】python 魔术方法
生活随笔
收集整理的這篇文章主要介紹了
【python 10】python 魔术方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、`__getitem__` 獲取屬性
- 二、`__setitem__` 設置屬性
- 三、`__delitem__` 刪除屬性
- 四、`__len__` 求長度
- 五、`__call__` 將類變成一個可調用的函數
python 中以 “__” 開頭和結尾的成員,都被稱為類的特殊成員(特殊屬性和方法)。
一、__getitem__ 獲取屬性
在字典和列表中,我們經常會用到 [] 來獲取對應元素,因為字典和列表中都內置了 __getitem__ 方法。
"__getitem__" in (dir(list)) >>> True "__getitem__" in (dir(dict)) >>> True__getitem__ 的作用:
當定義了一個類的時候,當該類的實例化對象通過 [] 來取值的時候,會調用 __getitem__ 方法,也就是說這個方法能夠返回與指定鍵相關聯的值
使用 [] 對對象中的屬性進行取值、賦值或刪除時,會自動觸發對應的 __getitem__、__setitem__、__delitem__ 方法
class DataBase:def __init__(self,id,address):#初始化方法self.id=idself.address=addressself.d={self.id:1,self.address:"192.168.1.1"}def __getitem__(self,key):return self.d.get(key,"default")data=DataBase(1,"192.168.1.1") print(data['hi']) # output default print(data[data.id]) # output 1 print(data[data.address]) # output 192.168.1.1 print(data[1]) # output 1 class Person(object):def __init__(self, info):self.info = infodef __getitem__(self, key):print('__getitem__:', key)return self.info[key] person_info = {'xiaowang': 1, 'xiaoming': 2, 'xiaohong': 3} person = Person(person_info) print(person['xiaoming']) >>> __getitem__: xiaoming 2如果沒有定義 __getitem__ 但使用 [] 來取屬性的話,則會報錯:
class Person(object):def __init__(self, info):self.info = info person_info = {'xiaowang': 1, 'xiaoming': 2, 'xiaohong': 3} person = Person(person_info) print(person['xiaoming']) >>> TypeError: 'Person' object is not subscriptable二、__setitem__ 設置屬性
__setitem__ 可以設置屬性,可以新增,也可以修改現有的
class Person(object):def __init__(self, info):self.info = infodef __setitem__(self, key, value):print('__setitem__:', key, value)self.info[key] = value person_info = {'xiaowang': 1, 'xiaoming': 2, 'xiaohong': 3} person = Person(person_info)###### 2、修改 person['xiaobai'] = 4 print('person_info after change:', person_info) >>> __setitem__: xiaobai 4 person_info after change: {'xiaowang': 1, 'xiaoming': 2, 'xiaohong': 3, 'xiaobai': 4} class Person(object):def __init__(self, info):self.info = infodef __setitem__(self, key, value):print('__setitem__:', key, value)self.info[key] = value person_info = {'xiaowang': 1, 'xiaoming': 2, 'xiaohong': 3} person = Person(person_info)###### 2、修改 person['xiaowang'] = 5 print('person_info after change:', person_info) >>> __setitem__: xiaowang 5 person_info after change: {'xiaowang': 5, 'xiaoming': 2, 'xiaohong': 3}三、__delitem__ 刪除屬性
class Person(object):def __init__(self, info):self.info = infodef __delitem__(self, key):print('__delitem__:', key)del self.info[key]def __len__(self):return len(self.info) person_info = {'xiaowang': 1, 'xiaoming': 2, 'xiaohong': 3} person = Person(person_info) ###### 3、刪除 del person['xiaoming'] print('person_info after del:', person_info) >>> __delitem__: xiaoming person_info after del: {'xiaowang': 1, 'xiaohong': 3}四、__len__ 求長度
class Person(object):def __init__(self, info):self.info = infodef __len__(self):return len(self.info) person_info = {'xiaowang': 1, 'xiaoming': 2, 'xiaohong': 3} person = Person(person_info) ###### 4、求長度 print('final len of info:', len(person_info)) >>> final len of info: 3總體代碼:
class Person(object):def __init__(self, info):self.info = infodef __getitem__(self, key):print('__getitem__:', key)return self.info[key]def __setitem__(self, key, value):print('__setitem__:', key, value)self.info[key] = valuedef __delitem__(self, key):print('__delitem__:', key)del self.info[key]def __len__(self):return len(self.info) person_info = {'xiaowang': 1, 'xiaoming': 2, 'xiaohong': 3} person = Person(person_info) ###### 1、獲取 print('xiaoming:', person['xiaoming']) >>> __getitem__: xiaoming xiaoming: 2###### 2、修改 person['xiaobai'] = 4 print('person_info after change:', person_info) >>> __setitem__: xiaobai 4 person_info after change: {'xiaowang': 1, 'xiaoming': 2, 'xiaohong': 3, 'xiaobai': 4}###### 3、刪除 del person['xiaoming'] print('person_info after del:', person_info) >>> __delitem__: xiaoming person_info after del: {'xiaowang': 1, 'xiaohong': 3, 'xiaobai': 4}###### 4、求長度 print('final len of info:', len(person_info)) >>> final len of info: 3五、__call__ 將類變成一個可調用的函數
__call__ 的本質其實是將一個類變成一個函數,使得這個類的實例可以像函數一樣調用
python 中,凡是可以將 () 直接應用到自身并執行,都稱為“可調用對象”,可調用對象包括自定義函數、python 內置函數、以及類實例對象(即有 call 的類)
對于可調用對象,名稱() 可以理解為 名稱.__call__() 的簡寫,
class Test(object):def __init__(self, name):self.name = namedef __call__(self):print('here is in __call__!')print('my name is {}'.format(self.name)) test = Test('xiaowang') test() >>> here is in __call__! my name is xiaowang當類中沒寫 __call__ 的時候:
class Test(object):def __init__(self, name):self.name = name test = Test('xiaowang') test() >>> TypeError: 'Test' object is not callable 報錯該對象無法調用總結
以上是生活随笔為你收集整理的【python 10】python 魔术方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星更新 iOS / iPadOS 版
- 下一篇: 【python 11】super()