一文帶你探索Python中15個(gè)常見的魔術(shù)方法
概述
在Python中,特殊方法(也稱為魔術(shù)方法)是由Python解釋器自動(dòng)調(diào)用的,我們不需要手動(dòng)調(diào)用它們,而是使用內(nèi)置函數(shù)來(lái)間接地使用它們。舉個(gè)例子,我們可以實(shí)現(xiàn)特殊方法__len__()
,然后通過(guò)使用內(nèi)置函數(shù)len()來(lái)獲取對(duì)象的長(zhǎng)度。同樣地,一些特殊方法的調(diào)用是隱式的,比如在使用for循環(huán)時(shí),實(shí)際上是在使用內(nèi)置函數(shù)iter(x)來(lái)迭代對(duì)象x。
在Java中,并沒(méi)有像Python那樣簡(jiǎn)單的實(shí)現(xiàn)方式。如果要進(jìn)行比較,你需要實(shí)現(xiàn)compare方法;如果想要生成特定的對(duì)象,必須編寫適當(dāng)?shù)臉?gòu)造器方法;如果想要打印對(duì)象,就需要實(shí)現(xiàn)toString方法等等。此外,在Java中的魔術(shù)類或方法以及各種本地方法基本上是不允許我們修改的。因此,我們還是簡(jiǎn)單地看一下Python是如何調(diào)用的吧。
常用特殊方法及實(shí)現(xiàn)
下面將介紹一些常用特殊方法和實(shí)現(xiàn)。
__init__(self, ...)
構(gòu)造函數(shù)主要用于初始化對(duì)象的屬性。通過(guò)在類中定義__init__方法,可以在創(chuàng)建對(duì)象時(shí)自動(dòng)調(diào)用該方法來(lái)初始化對(duì)象的屬性。在構(gòu)造函數(shù)中,可以通過(guò)self參數(shù)來(lái)訪問(wèn)對(duì)象的屬性和方法,并為其賦予初始值。構(gòu)造函數(shù)在對(duì)象創(chuàng)建時(shí)只會(huì)被調(diào)用一次,可以在其中執(zhí)行一些必要的初始化操作,以確保對(duì)象在創(chuàng)建后處于正確的狀態(tài)。
class Person: def __init__(self, name, age): self.name = name self.age = age person = Person('xiaoyu', 18) print(person.name) # 輸出: xiaoyu print(person.age) # 輸出: 18
__str__(self)
返回對(duì)象的字符串表示,可通過(guò)print(obj)來(lái)調(diào)用。這個(gè)方法對(duì)于調(diào)試和輸出對(duì)象信息非常有用,可以提供更友好和可讀性更高的輸出結(jié)果。通過(guò)實(shí)現(xiàn)__str__方法,我們可以輕松地控制對(duì)象的打印行為,使其更符合我們的需求和預(yù)期。
class Person: def __init__(self, name, age): self.name = name self.age = age def __str__(self): return f"Person: {self.name}, {self.age} years old" person = Person('xiaoyu', 18) print(person) # 輸出: Person: xiaoyu, 18 years old
__repr__(self)
返回對(duì)象的可打印字符串表示,可通過(guò)obj來(lái)調(diào)用。與__str__
方法類似,__repr__
方法也用于提供對(duì)象的字符串表示,但它的目標(biāo)是更加精確和完整地描述對(duì)象的內(nèi)部狀態(tài)和結(jié)構(gòu)。
class Person: def __init__(self, name, age): self.name = name self.age = age def __repr__(self): return f"Person(name={self.name}, age={self.age})" person = Person('xiaoyu', 18) print(person) # 輸出: Person(name=xiaoyu, age=18)
__len__(self)
返回對(duì)象的長(zhǎng)度,可通過(guò)len(obj)來(lái)調(diào)用。在Python中,len()函數(shù)通常用于獲取容器對(duì)象的元素個(gè)數(shù),比如列表、字符串、字典等。通過(guò)實(shí)現(xiàn)__len__
方法,我們可以自定義對(duì)象的長(zhǎng)度,并使其適應(yīng)于特定的應(yīng)用場(chǎng)景。例如,如果我們定義了一個(gè)自定義的容器類,可以通過(guò)實(shí)現(xiàn)__len__
方法來(lái)返回容器中元素的個(gè)數(shù)。這樣,我們就可以像對(duì)待其他內(nèi)置容器一樣,使用len()函數(shù)來(lái)獲取自定義容器對(duì)象的長(zhǎng)度。
class MyList: def __init__(self): self.data = [] def __len__(self): return len(self.data) my_list = MyList() my_list.data = [1, 2, 3, 4, 5] print(len(my_list)) # 輸出: 5
__getitem__(self, key)
獲取對(duì)象的指定元素,可通過(guò)obj[key]來(lái)調(diào)用。并將鍵值key傳遞給它作為參數(shù)。
class MyList: def __init__(self): self.data = [] def __getitem__(self, key): return self.data[key] my_list = MyList() my_list.data = [1, 2, 3, 4, 5] print(my_list[2]) # 輸出: 3
__setitem__(self, key, value)
設(shè)置對(duì)象的指定元素,通過(guò)重載該方法,可以實(shí)現(xiàn)通過(guò)obj[key] = value來(lái)調(diào)用該方法。
class MyList: def __init__(self): self.data = [] def __setitem__(self, key, value): self.data[key] = value my_list = MyList() my_list.data = [1, 2, 3, 4, 5] my_list[2] = 10 print(my_list.data) # 輸出: [1, 2, 10, 4, 5]
__delitem__(self, key)
刪除對(duì)象的指定元素,可通過(guò)del obj[key]來(lái)調(diào)用。當(dāng)你想要從對(duì)象中刪除特定的元素時(shí),這個(gè)方法會(huì)非常有用。
class MyList: def __init__(self): self.data = [] def __delitem__(self, key): del self.data[key] my_list = MyList() my_list.data = [1, 2, 3, 4, 5] del my_list[2] print(my_list.data) # 輸出: [1, 2, 4, 5]
__iter__(self)
返回一個(gè)可迭代對(duì)象,以便我們可以通過(guò)for item in obj的方式進(jìn)行迭代。
class MyList: def __init__(self): self.data = [] def __iter__(self): return iter(self.data) my_list = MyList() my_list.data = [1, 2, 3, 4, 5] for item in my_list: print(item) # 輸出: 1 2 3 4 5
__next__(self)
返回迭代器的下一個(gè)元素,可通過(guò)next(obj)來(lái)調(diào)用。
class MyIterator: def __init__(self): self.data = [1, 2, 3, 4, 5] self.index = 0 def __next__(self): if self.index >= len(self.data): raise StopIteration item = self.data[self.index] self.index += 1 return item my_iterator = MyIterator() print(next(my_iterator)) # 輸出: 1 print(next(my_iterator)) # 輸出: 2 print(next(my_iterator)) # 輸出: 3
__call__(self, ...)
將對(duì)象作為函數(shù)調(diào)用時(shí)觸發(fā),可通過(guò)obj(...)來(lái)調(diào)用。
class MyFunc: def __call__(self, x, y): return x + y my_func = MyFunc() result = my_func(3, 4) print(result) # 輸出: 7
__eq__(self, other)
判斷對(duì)象是否相等,可通過(guò)obj == other來(lái)調(diào)用。在Java中如果判斷對(duì)象引用的話,你也需要重寫equals這個(gè)方法。
class Point: def __init__(self, x, y): self.x = x self.y = y def __eq__(self, other): return self.x == other.x and self.y == other.y point1 = Point(1, 2) point2 = Point(1, 2) print(point1 == point2) # 輸出: True
__lt__(self, other)
判斷對(duì)象是否小于另一個(gè)對(duì)象,可通過(guò)obj < other來(lái)調(diào)用。
class Point: def __init__(self, x, y): self.x = x self.y = y def __lt__(self, other): return self.x < other.x and self.y < other.y point1 = Point(1, 2) point2 = Point(3, 4) print(point1 < point2) # 輸出: True
__gt__(self, other)
判斷對(duì)象是否大于另一個(gè)對(duì)象,可通過(guò)obj > other來(lái)調(diào)用。
class Point: def __init__(self, x, y): self.x = x self.y = y def __gt__(self, other): return self.x > other.x and self.y > other.y point1 = Point(3, 4) point2 = Point(1, 2) print(point1 > point2) # 輸出: True
__add__(self, other)
定義對(duì)象的加法操作,可通過(guò)obj + other來(lái)調(diào)用。這樣的話,你也可以對(duì)對(duì)象進(jìn)行進(jìn)行運(yùn)算操作了
class Vector: def __init__(self, x, y): self.x = x self.y = y def __add__(self, other): return Vector(self.x + other.x, self.y + other.y) vector1 = Vector(1, 2) vector2 = Vector(3, 4) result = vector1 + vector2 print(result.x, result.y) # 輸出: 4 6
__sub__(self, other)
定義對(duì)象的減法操作,可通過(guò)obj - other來(lái)調(diào)用。
class Vector: def __init__(self, x, y): self.x = x self.y = y def __sub__(self, other): return Vector(self.x - other.x, self.y - other.y) vector1 = Vector(3, 4) vector2 = Vector(1, 2) result = vector1 - vector2 print(result.x, result.y) # 輸出: 2 2
常用特殊(魔術(shù))方法的匯總一覽表
以下是20個(gè)常用的特殊方法及其調(diào)用方式的表格,再多的用到了我們?cè)诳匆幌戮涂梢粤耍灰涀。╛_)這個(gè)下劃線開頭和結(jié)尾的方法就可。請(qǐng)看下表:
特殊方法 | 描述 | 調(diào)用方式 |
---|---|---|
__init__ | 初始化對(duì)象 | obj = ClassName() |
__str__ | 返回對(duì)象的字符串表示 | str(obj) |
__len__ | 返回對(duì)象的長(zhǎng)度 | len(obj) |
__getitem__ | 獲取對(duì)象的元素 | obj[index] |
__setitem__ | 設(shè)置對(duì)象的元素 | obj[index] = value |
__delitem__ | 刪除對(duì)象的元素 | del obj[index] |
__contains__ | 判斷對(duì)象是否包含某個(gè)元素 | value in obj |
__add__ | 實(shí)現(xiàn)對(duì)象的加法 | obj1 + obj2 |
__sub__ | 實(shí)現(xiàn)對(duì)象的減法 | obj1 - obj2 |
__mul__ | 實(shí)現(xiàn)對(duì)象的乘法 | obj1 * obj2 |
__div__ | 實(shí)現(xiàn)對(duì)象的除法 | obj1 / obj2 |
__eq__ | 判斷對(duì)象是否相等 | obj1 == obj2 |
__ne__ | 判斷對(duì)象是否不相等 | obj1 != obj2 |
__lt__ | 判斷對(duì)象是否小于 | obj1 < obj2 |
__gt__ | 判斷對(duì)象是否大于 | obj1 > obj2 |
__le__ | 判斷對(duì)象是否小于等于 | obj1 <= obj2 |
__ge__ | 判斷對(duì)象是否大于等于 | obj1 >= obj2 |
__iter__ | 返回一個(gè)迭代器對(duì)象 | iter(obj) |
__next__ | 返回迭代器的下一個(gè)元素 | next(obj) |
__del__ | 對(duì)象銷毀時(shí)調(diào)用 | del obj |
__call__ | 將對(duì)象作為函數(shù)調(diào)用 | obj() |
總結(jié)
Python中的特殊方法(魔術(shù)方法)是由Python解釋器自動(dòng)調(diào)用的,用于實(shí)現(xiàn)對(duì)象的特定功能。常用的特殊方法包括__init__
、__str__
、__repr__
、__len__
、__getitem__
、__setitem__
、__delitem__
、__iter__
、__next__
、__call__
等。通過(guò)實(shí)現(xiàn)這些特殊方法,我們可以自定義對(duì)象的行為,使其更加符合我們的需求和預(yù)期。這些特殊方法的調(diào)用方式也有所不同,可以通過(guò)內(nèi)置函數(shù)、運(yùn)算符、迭代等方式來(lái)調(diào)用。掌握了這些特殊方法的用法,可以提高我們?cè)赑ython中編寫類和對(duì)象的靈活性和可擴(kuò)展性。
以上就是一文帶你探索Python中15個(gè)常見的魔術(shù)方法的詳細(xì)內(nèi)容,更多關(guān)于Python魔術(shù)方法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python argparse 解析命令行參數(shù)模塊詳情
這篇文章主要介紹了Python argparse 解析命令行參數(shù)模塊詳情,argparse是python用于解析命令行參數(shù)和選項(xiàng)的標(biāo)準(zhǔn)模塊,用于代替已經(jīng)過(guò)時(shí)的optparse模塊2022-07-07Python使用numpy模塊創(chuàng)建數(shù)組操作示例
這篇文章主要介紹了Python使用numpy模塊創(chuàng)建數(shù)組操作,結(jié)合實(shí)例形式分析了Python使用numpy模塊實(shí)現(xiàn)數(shù)組的創(chuàng)建、賦值、修改、打印等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-06-06基于python實(shí)現(xiàn)動(dòng)態(tài)煙霧效果
動(dòng)態(tài)煙霧效果常用于游戲和動(dòng)畫中,為場(chǎng)景增添 逼真的視覺(jué)效果,在這篇博客中,我們將使用Python和Pygame庫(kù)來(lái)創(chuàng)建一個(gè)逼真的煙霧動(dòng)畫效果,感興趣的小伙伴跟著小編一起來(lái)看看吧2024-09-09Python3實(shí)現(xiàn)并發(fā)檢驗(yàn)代理池地址的方法
這篇文章主要介紹了Python3實(shí)現(xiàn)并發(fā)檢驗(yàn)代理池地址的方法,實(shí)例分析了Python3基于線程的代理檢驗(yàn)操作相關(guān)技巧,需要的朋友可以參考下2016-09-09Python 輸出詳細(xì)的異常信息(traceback)方式
這篇文章主要介紹了Python 輸出詳細(xì)的異常信息(traceback)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04flask?route對(duì)協(xié)議作用及設(shè)計(jì)思路
這篇文章主要為大家介紹了flask?route對(duì)協(xié)議作用及設(shè)計(jì)思路詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07Python實(shí)例之wxpython中Frame使用方法
本文介紹下wxpython中Frame的用法,不錯(cuò)的python編程實(shí)例,有需要的朋友參考下2014-06-06