python之路-双下方法
生活随笔
收集整理的這篇文章主要介紹了
python之路-双下方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
雙下方法
定義: 雙下方法是特殊方法,他是解釋器提供的,由雙下線加方法名加雙下劃線 __方法名__具有特殊意義的方法 雙下方法主要是Python源碼程序員使用的,元編程 我們在開發中盡量不要使用雙下方法,但是深入研究雙下方法,更有益于我們閱讀源碼1.__len__ 計算長度
s = 'nihaoashuaige' print(len(s)) #len作為內置函數,部分數據類型調用它的時候就會返回其長度,那是什么讓這個函數起了這樣的作用呢 #看一下字符串的str類的內容里有__len__方法,所以調用len內置函數,其實就是觸發了__len__方法?
class A:def __init__(self,name,age):self.name = nameself.age = agedef __len__(self):print('調用len方法')return len(self.__dict__) obj = A('紅','24') print(len(obj)) 打印結果: 調用len方法 2 觸發機制: 調用len,就立即觸發了__len__方法,并執行里面的內容2.__hash__
#我們之前說過,可hash的就是不可變的數據類型,那么這個是如何進行判斷的呢 print(hash('nihao')) #返回一串數字 print(hash(123)) #返回一串數字 print(hash([1,2,3])) #報錯 打印結果: -3334696613266170804 123?
3.__str__
class A:def __init__(self,name,age):self.name = nameself.age = agedef __str__(self): #打印的時候返回的結果值return self.name obj = A('nihao',18) print(obj) 打印結果: nihao?
4.__repr__
repr內置函數,原形畢露,調用repr,則觸發__repr__方法,返回其原始值 class A:def __repr__(self):return 'nihao' obj = A() print(repr(obj)) 打印結果: nihao?
5.__call__ 對象后面加(),觸發執行
class A:def __init__(self):print(111)def __call__(self, *args, **kwargs):print(666) obj = A() obj() ##對象+()觸發__call__方法 打印結果: 111 666?
6.__eq__
class A:def __init__(self):self.a = 1self.b = 2def __eq__(self, other):print(666)return '比較' a = A() b = A() print(a == b) #同一個類的兩個實例進行比較,就會觸發類中的__eq__方法 打印結果: 666 比較?
7.__del__
析構方法,當對象在內存中被釋放時,自動觸發執行。 注:此方法一般無須定義,因為Python是一門高級語言,程序員在使用時無需關心內存的分配和釋放,因為此工作都是交給Python解釋器來執行,所以,析構函數的調用是由解釋器在進行垃圾回收時自動觸發執行的。8.__new__ 類名+()觸發__new__方法 構造方法
class A:def __init__(self,name,age):self.name = nameself.age = agedef __new__(cls, *args, **kwargs):print(666)return object.__new__(cls) obj = A('xiaohong','19') ##構造一個對象是先觸發__new__方法 單例模式(一個類只能實例化一個對象) class A:__instance = Nonedef __new__(cls,*args,**kwargs):if not cls.__instance:obj = object.__new__(cls)cls.__instance = objreturn cls.__instance ret = A() print(ret) ret = A() print(ret) ret = A() print(ret) 打印結果: <__main__.A object at 0x00000263D5202B00> <__main__.A object at 0x00000263D5202B00> <__main__.A object at 0x00000263D5202B00>?
9.__item__相關
當你對對象進行類似于字典的操作的時候,就會觸發相應的方法 class A:def __init__(self,name):self.name = namedef __getitem__(self, item):return self.__dict__[item]def __setitem__(self, key, value):self.__dict__[key] = valuedef __delitem__(self, key):print('刪除的時候執行我') ret = A('nihao') print(ret['name']) #執行getitem ret['name'] = 'xiaohong' #執行setitem print(ret.__dict__) del ret['name'] #執行delitem 打印結果: nihao {'name': 'xiaohong'} 刪除的時候執行我?
10.上下文管理器相關(__enter__ 和 __exit__)
class A:def __init__(self,text):self.text = textdef __enter__(self): #開啟上下文管理器時執行此方法self.text = self.text + '來了'return selfdef __exit__(self, exc_type, exc_val, exc_tb): #執行完上下文管理器時執行此方法self.text = self.text + '走了'return self obj = A('baobao') with obj as f:print(f.text) print(f.text) 打印結果: baobao來了 baobao來了走了?
?
?
?
?
轉載于:https://www.cnblogs.com/Ailsa-a/p/10519885.html
總結
以上是生活随笔為你收集整理的python之路-双下方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装Ubuntu 18.04后的一些操作
- 下一篇: CentOS7部署NFS