日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【python 10】python 魔术方法

發(fā)布時間:2023/12/15 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【python 10】python 魔术方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 一、`__getitem__` 獲取屬性
    • 二、`__setitem__` 設(shè)置屬性
    • 三、`__delitem__` 刪除屬性
    • 四、`__len__` 求長度
    • 五、`__call__` 將類變成一個可調(diào)用的函數(shù)

python 中以 “__” 開頭和結(jié)尾的成員,都被稱為類的特殊成員(特殊屬性和方法)。

一、__getitem__ 獲取屬性

在字典和列表中,我們經(jīng)常會用到 [] 來獲取對應(yīng)元素,因為字典和列表中都內(nèi)置了 __getitem__ 方法。

"__getitem__" in (dir(list)) >>> True "__getitem__" in (dir(dict)) >>> True

__getitem__ 的作用:

當定義了一個類的時候,當該類的實例化對象通過 [] 來取值的時候,會調(diào)用 __getitem__ 方法,也就是說這個方法能夠返回與指定鍵相關(guān)聯(lián)的值

使用 [] 對對象中的屬性進行取值、賦值或刪除時,會自動觸發(fā)對應(yīng)的 __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__ 設(shè)置屬性

__setitem__ 可以設(shè)置屬性,可以新增,也可以修改現(xiàn)有的

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__ 將類變成一個可調(diào)用的函數(shù)

__call__ 的本質(zhì)其實是將一個類變成一個函數(shù),使得這個類的實例可以像函數(shù)一樣調(diào)用

python 中,凡是可以將 () 直接應(yīng)用到自身并執(zhí)行,都稱為“可調(diào)用對象”,可調(diào)用對象包括自定義函數(shù)、python 內(nèi)置函數(shù)、以及類實例對象(即有 call 的類)

對于可調(diào)用對象,名稱() 可以理解為 名稱.__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 報錯該對象無法調(diào)用

總結(jié)

以上是生活随笔為你收集整理的【python 10】python 魔术方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。