精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

每個程序員都應(yīng)該知道的11個Python魔術(shù)方法

譯文
開發(fā)
想要在Python類中支持內(nèi)置函數(shù)和方法調(diào)用的行為嗎?Python中的魔術(shù)方法可以讓您做到這一點!本文揭開魔術(shù)方法背后的魔法。

譯者 | 布加迪

審校 | 重樓

Python中,魔術(shù)方法Magic Method)可以幫助您模擬Python類中內(nèi)置函數(shù)的行為。這些方法前后雙下劃線__,因此也被稱為Dunder方法。

這些魔術(shù)方法還可以幫助您在Python中實現(xiàn)操作符重載。您可能見過這樣的例子就像兩個整數(shù)與乘法運(yùn)算符*一起使用得到乘積一樣。當(dāng)它與字符串和整數(shù)k一起使用時,字符串會重復(fù)k

>>> 3 * 4
12
>>> 'code' * 3
'codecodecode'

我們在本文中將通過創(chuàng)建一個簡單的二維向量Vector2D類來探索Python中的魔術(shù)方法。

我們將從您可能熟悉的方法入手,逐步構(gòu)建更有幫助的魔術(shù)方法。

不妨開始編寫一些魔術(shù)方法

1. __init__

考慮下面的Vector2D

class Vector2D:
 pass

一旦創(chuàng)建了類,并實例化對象,就可以添加如下屬性obj_name.attribute_name = value

然而,您需要在實例化對象時初始化這些屬性,而不是手動向創(chuàng)建的每個實例添加屬性當(dāng)然,這一點也不有趣!)

為此,您可以定義__init__方法。不妨Vector2D類定義__init__方法

class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

v = Vector2D(3, 5)

2. __repr__

當(dāng)您嘗試檢查或打印輸出實例化的對象時,您將發(fā)現(xiàn)沒有得到任何有幫助的信息。

v = Vector2D(3, 5)
print(v)

Output >>> <__main__.Vector2D object at 0x7d2fcfaf0ac0>

這就是為什么您應(yīng)該添加一個表示字符串,一個對象的字符串表示。為此,添加__repr__方法,如下所示

class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

 def __repr__(self):
 return f"Vector2D(x={self.x}, y={self.y})"

v = Vector2D(3, 5)
print(v)


Output >>> Vector2D(x=3, y=5)

__repr__應(yīng)該包含創(chuàng)建類實例所需的所有屬性和信息。__repr__方法通常用于調(diào)試目的。

3. __str__

__str__也用于添加對象的字符串表示。通常,__str__方法用于類的最終用戶提供信息。

不妨給我們的類添加一個__str__方法

class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

 def __str__(self):
 return f"Vector2D(x={self.x}, y={self.y})"

v = Vector2D(3, 5)
print(v)


Output >>> Vector2D(x=3, y=5)

如果沒有__str__的實現(xiàn),它就返回到__repr__。因此對于您創(chuàng)建的每個類,您至少應(yīng)該添加__repr__方法。

4. __eq__

接下來,不妨添加一個方法來檢查Vector2D類的任意兩個對象是否相等。如果兩個向量有相同的x和y坐標(biāo),它們是相等的。

現(xiàn)在創(chuàng)建兩個具有相等x和y值的Vector2D對象,并比較它們是否相等

v1 = Vector2D(3, 5)
v2 = Vector2D(3, 5)
print(v1 == v2)

結(jié)果為False因為默認(rèn)情況下比較會檢查內(nèi)存中對象ID是否相等。

Output >>> False

不妨添加__eq__方法來檢查是否相等

class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

 def __repr__(self):
 return f"Vector2D(x={self.x}, y={self.y})"

 def __eq__(self, other):
 return self.x == other.x and self.y == other.y

檢查相等性現(xiàn)在應(yīng)該按預(yù)期工作

v1 = Vector2D(3, 5)
v2 = Vector2D(3, 5)
print(v1 == v2)


Output >>> True 

5. __len__

Python的內(nèi)置len()函數(shù)可以幫助您計算內(nèi)置可迭代對象(iterable)的長度。比如說,向量而言,length應(yīng)該返回該向量所包含的元素的個數(shù)。

所以不妨為Vector2D類添加一個__len__方法

class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

 def __repr__(self):
 return f"Vector2D(x={self.x}, y={self.y})"

 def __len__(self):
 return 2

v = Vector2D(3, 5)
print(len(v))

Vector2D類的所有對象長度為2

Output >>> 2

6. __add__

現(xiàn)在不妨考慮對向量執(zhí)行的常見運(yùn)算。不妨添加魔術(shù)方法來加減任意兩個向量。

如果直接嘗試添加兩個向量對象,就會遇到錯誤。所以您應(yīng)該添加一個__add__方法

class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

 def __repr__(self):
 return f"Vector2D(x={self.x}, y={self.y})"

 def __add__(self, other):
 return Vector2D(self.x + other.x, self.y + other.y)

您現(xiàn)在可以像這樣添加任意兩個向量

v1 = Vector2D(3, 5)
v2 = Vector2D(1, 2)
result = v1 + v2
print(result)


Output >>> Vector2D(x=4, y=7)

7. __sub__

下來,不妨添加一個__sub__方法來計算Vector2D類的任意兩個對象之間的差異

class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

 def __repr__(self):
 return f"Vector2D(x={self.x}, y={self.y})"

 def __sub__(self, other):
 return Vector2D(self.x - other.x, self.y - other.y)


v1 = Vector2D(3, 5)
v2 = Vector2D(1, 2)
result = v1 - v2
print(result)


Output >>> Vector2D(x=2, y=3)

8. __mul__

我們還可以定義__mul__方法來定義對象之間的乘法。

不妨來處理

  • 標(biāo)量乘法向量與標(biāo)量的乘法
  • 內(nèi)積兩個向量的點積
class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

 def __repr__(self):
 return f"Vector2D(x={self.x}, y={self.y})"

 def __mul__(self, other):
 # Scalar multiplication
 if isinstance(other, (int, float)):
 return Vector2D(self.x * other, self.y * other)
 # Dot product
 elif isinstance(other, Vector2D):
 return self.x * other.x + self.y * other.y
 else:
 raise TypeError("Unsupported operand type for *")

現(xiàn)在我們將舉幾個例子看看__mul__方法是如何實際工作的。

v1 = Vector2D(3, 5)
v2 = Vector2D(1, 2)

# Scalar multiplication
result1 = v1 * 2
print(result1) 
# Dot product
result2 = v1 * v2
print(result2)


Output >>>

Vector2D(x=6, y=10)
13

9. __getitem__

__getitem__魔術(shù)方法可以索引對象并使用熟悉的方括號[]語法訪問屬性或?qū)傩郧衅?/span>

對于Vector2D類的對象v:

  • v [0]x坐標(biāo)
  • v [1]y坐標(biāo)

如果您嘗試通過索引訪問,您會遇到錯誤

v = Vector2D(3, 5)
print(v[0],v[1])


---------------------------------------------------------------------------

TypeError  Traceback (most recent call last)

 in ()
----> 1 print(v[0],v[1])

TypeError: 'Vector2D' object is not subscriptable

不妨實現(xiàn)__getitem__ 方法:

class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

 def __repr__(self):
 return f"Vector2D(x={self.x}, y={self.y})"

 def __getitem__(self, key):
 if key == 0:
 return self.x
 elif key == 1:
 return self.y
 else:
 raise IndexError("Index out of range")

現(xiàn)在您可以使用索引訪問這些元素,如下所示

v = Vector2D(3, 5)
print(v[0]) 
print(v[1])


Output >>>

3
5

10. __call__

借助__call__方法的實現(xiàn),您可以像調(diào)用函數(shù)一樣調(diào)用對象。

在Vector2D類中,我們可以實現(xiàn)__call__按給定因子縮放

class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

 def __repr__(self):
 return f"Vector2D(x={self.x}, y={self.y})"

 def __call__(self, scalar):
 return Vector2D(self.x * scalar, self.y * scalar)

如果您現(xiàn)在調(diào)用3,會得到縮放3向量:

v = Vector2D(3, 5)
result = v(3)
print(result)


Output >>> Vector2D(x=9, y=15)

11. __getattr__

__getattr__方法用于獲取對象的特定屬性的值。

這個例子而言,我們可以添加一個__getattr__ dunder方法,一旦被調(diào)用可計算向量的量值(L2-norm):

class Vector2D:
 def __init__(self, x, y):
 self.x = x
 self.y = y

 def __repr__(self):
 return f"Vector2D(x={self.x}, y={self.y})"

 def __getattr__(self, name):
 if name == "magnitude":
 return (self.x ** 2 + self.y ** 2) ** 0.5
 else:
 raise AttributeError(f"'Vector2D' object has no attribute '{name}'")

不妨驗證這是否像預(yù)期的那樣工作

v = Vector2D(3, 4)
print(v.magnitude)


Output >>> 5.0

結(jié)論

這就是本教程的全部內(nèi)容希望您已經(jīng)學(xué)了如何為您的類添加魔術(shù)方法,以模擬內(nèi)置函數(shù)的行為。

我們已介紹了一些最有用的魔術(shù)方法但這并非詳盡的清單。為了進(jìn)一步理解,您可以創(chuàng)建一個所選擇的Python類,根據(jù)所需的功能添加魔術(shù)方法。最后祝編程愉快!

原文標(biāo)題:Harness the Power of AI for Business,作者:Bala Priya C

責(zé)任編輯:華軒 來源: 51CTO
相關(guān)推薦

2012-02-28 10:52:13

2018-03-07 12:57:53

2022-09-11 15:20:05

程序員命令開發(fā)

2012-10-11 10:32:48

Linux命令程序員

2024-04-24 14:52:26

JavaScriptWeb 開發(fā)

2021-10-18 10:21:28

程序員技能優(yōu)化

2023-01-31 15:43:47

2020-09-03 12:54:37

Python程序員macOS

2024-04-10 12:36:41

硬件代碼

2023-06-27 00:04:10

程序員JavaScript

2015-04-16 10:26:51

程序員 Python Ruby

2011-07-25 10:09:57

Python

2023-11-02 14:21:06

2021-08-19 15:14:29

程序員電子表格Airtable

2013-03-20 17:58:41

虛擬內(nèi)存程序員

2021-10-20 06:05:01

編程語言開發(fā)

2014-07-16 09:34:44

2017-04-05 12:04:17

python函數(shù)

2018-05-03 08:45:58

Linux命令

2011-06-16 08:58:57

軟考程序員
點贊
收藏

51CTO技術(shù)棧公眾號

国产福利精品一区二区三区| 热舞福利精品大尺度视频| 内射一区二区三区| 成人av动漫| 日本高清视频一区二区| 黄色网zhan| 天堂资源最新在线| 狠狠色丁香久久婷婷综合_中 | 日韩视频一区| 日韩在线一区二区三区免费视频| 可以看的av网址| 国产综合色区在线观看| 亚洲最新视频在线观看| 日韩亚洲欧美精品| 无码精品黑人一区二区三区| 免费视频一区| 欧美丰满老妇厨房牲生活| 91网站免费视频| 超碰97久久国产精品牛牛| 欧美色区777第一页| 欧美激情 国产精品| 国产三区在线观看| 国产免费观看久久| 好吊妞www.84com只有这里才有精品 | 日韩欧美视频一区二区三区| 日本黄xxxxxxxxx100| 成人77777| 久久综合网色—综合色88| 51国偷自产一区二区三区的来源| 青娱乐在线免费视频| 在线一区欧美| 性色av一区二区三区| 国产精品丝袜一区二区| 日韩av在线中文字幕| 亚洲毛片在线免费观看| 国产性生活毛片| 高清精品xnxxcom| 日韩午夜在线播放| 一级做a免费视频| 成人免费在线观看视频| 91精品福利视频| 国产成人久久777777| 成人免费观看在线观看| 亚洲成av人片一区二区三区| 激情五月婷婷六月| 青草影视电视剧免费播放在线观看| 亚洲日本一区二区| 中文字幕在线中文字幕日亚韩一区| 岛国在线视频免费看| 国产女同性恋一区二区| 日本一区视频在线观看| 超碰免费97在线观看| 国产亚洲一区二区在线观看| 欧美一区二区三区电影在线观看| 人操人视频在线观看| 久久午夜免费电影| 日本午夜精品一区二区三区| 黄上黄在线观看| 国产视频在线观看一区二区三区| 日韩久久精品一区二区三区| 成年人免费在线视频| 国产精品欧美久久久久一区二区 | 在线中文资源天堂| 国产精品色一区二区三区| 亚洲人成网站在线播放2019| 麻豆网站在线| 艳妇臀荡乳欲伦亚洲一区| 日韩黄色短视频| 欧美sm一区| 在线日韩av片| 欧美丝袜在线观看| 日韩一级淫片| 精品亚洲一区二区三区| 亚洲综合欧美综合| 91精品国产乱码久久久久久| 久久久久久亚洲精品不卡| 亚洲国产综合久久| 久久经典综合| 成人信息集中地欧美| 性生交大片免费看女人按摩| 91在线你懂得| 一区二区三区免费看| 欧美日韩视频在线播放| 亚洲国产精品一区二区久久恐怖片| 草草久久久无码国产专区| 日韩另类视频| 精品噜噜噜噜久久久久久久久试看| www.免费av| 久久久久美女| 91产国在线观看动作片喷水| 中文字幕91爱爱| 成人性生交大片免费看中文| 日本一区二区在线视频观看| 1stkiss在线漫画| 福利一区视频在线观看| 在线观看国产福利| 日韩高清一级| 久久精品国产清自在天天线| avove在线播放| 日韩在线a电影| 岛国一区二区三区高清视频| 懂色av中文在线| 亚洲风情在线资源站| 欧美婷婷精品激情| 久久悠悠精品综合网| 最近2019免费中文字幕视频三| 激情综合网五月婷婷| 日韩成人午夜精品| 狠狠色狠狠色综合人人| 蜜桃av在线免费观看| 欧美日韩日本国产| 在线播放国产视频| 日韩欧美二区| 日本欧美国产在线| 国产 日韩 欧美 精品| 中文字幕中文乱码欧美一区二区| 激情五月宗合网| 免费一级欧美在线大片| 夜夜嗨av一区二区三区四区| 日韩av一区二区在线播放| 国产乱妇无码大片在线观看| 天堂√在线观看一区二区| 极品av在线| 日韩精品一区二区三区视频播放| 成人欧美一区二区三区黑人一 | 欧美丝袜一区| 欧洲美女免费图片一区| 亚洲乱码国产乱码精品精软件| 国产精品福利在线播放| 91香蕉视频污版| 国产精品免费不| 88xx成人精品| 天堂影院在线| 黑人精品xxx一区| 国产麻豆剧传媒精品国产av| 黄色成人91| 96国产粉嫩美女| 超碰在线观看免费| 欧美精品乱码久久久久久| 内射毛片内射国产夫妻| 日韩精彩视频在线观看| 欧美一进一出视频| 欧美电影h版| 亚洲天堂第一页| 波多野结衣二区三区| 久久久久久97三级| 北条麻妃在线一区| 激情婷婷综合| 国产精品偷伦视频免费观看国产 | 天堂在线视频免费| 亚洲影视在线播放| 性高潮免费视频| 亚洲黄色精品| 久久精品日产第一区二区三区| 91桃色在线观看| 亚洲精品福利免费在线观看| 亚洲 欧美 日韩 综合| 26uuu亚洲| 亚洲精品乱码久久久久久自慰| 国产欧美日韩在线观看视频| 国产精品亚洲激情| 国产激情视频在线观看| 日韩欧美国产综合一区| 国产污视频在线观看| 91一区二区在线观看| 欧美性猛交久久久乱大交小说 | 99久久久国产精品| 国产女大学生av| 欧美美女一区| 亚洲iv一区二区三区| 青草青在线视频| 亚洲欧美中文字幕| 91国在线视频| 亚洲成人免费电影| 伊人网伊人影院| 精品一区二区日韩| 国内精品在线观看视频| 九一国产精品| 69堂成人精品视频免费| 高清视频在线观看三级| 中文字幕精品一区久久久久| av中文字幕在线免费观看| 性欧美疯狂xxxxbbbb| 性欧美一区二区| 国产高清精品久久久久| 亚洲精品无码久久久久久| 91麻豆精品国产91久久久平台| 亚洲自拍在线观看| 成人福利av| 久久久精品中文字幕| 亚洲av成人精品毛片| 欧美日韩亚洲综合在线 | 欧洲精品一区二区| 欧美精品一区二区成人| 久久久久亚洲蜜桃| 中文写幕一区二区三区免费观成熟| 国产日韩欧美| 男女啪啪的视频| 国产一区二区三区电影在线观看 | 国产在线不卡| 色999日韩自偷自拍美女| 成人av资源网址| 国产人妖伪娘一区91| 日本在线啊啊| 欧美成人免费小视频| av色图一区| 日韩精品视频在线观看免费| 国产成人精品一区二区无码呦 | 日本久久久久久久久久久久| 亚洲激情自拍| 特级西西444| 日韩精品dvd| 久久一区二区三区av| 99re热精品视频| 91久久在线观看| 免费在线成人激情电影| 欧美一级视频免费在线观看| 久久99亚洲网美利坚合众国| www.99久久热国产日韩欧美.com| 欧美欧美欧美| 精品亚洲一区二区| 手机在线观看毛片| 精品国产网站在线观看| 99热这里只有精品1| 欧美视频完全免费看| 精品国产一区二区三区四| 亚洲午夜免费电影| 黄色片在线观看网站| 最新高清无码专区| 91精品少妇一区二区三区蜜桃臀| 国产亚洲欧美在线| 日本xxxxxxxxx18| 91毛片在线观看| 爱爱的免费视频| 99re视频精品| 国产毛片毛片毛片毛片毛片毛片| 成人久久视频在线观看| 91精品国产高清91久久久久久 | 欧美亚洲网站| www.玖玖玖| 亚洲一区自拍| 国产男女无遮挡| 老司机亚洲精品| 日韩av播放器| 麻豆国产精品777777在线| av在线网址导航| 激情五月婷婷综合| 亚洲一区二区图片| 丁香天五香天堂综合| 日韩黄色一区二区| 不卡影院免费观看| 中文字幕无码人妻少妇免费| 91麻豆精品在线观看| 亚洲专区区免费| 国产午夜精品一区二区三区视频| 91成人在线免费视频| 中文文精品字幕一区二区| 欧美性生交大片| 亚洲欧美日本韩国| 国产一级免费av| 日韩欧美黄色动漫| 亚洲一区二区三区网站| 制服丝袜激情欧洲亚洲| 亚洲黄色片视频| 精品在线观看国产| av中文字幕在线| 欧美成人免费播放| 蜜桃视频动漫在线播放| 国产成人综合亚洲| 国产高清视频一区二区| 国产精品三区在线| 精品在线播放| 伊人情人网综合| 在线看片一区| 亚洲精美色品网站| 9久久9毛片又大又硬又粗| 午夜在线视频观看日韩17c| 日韩av一二三四| 另类专区欧美蜜桃臀第一页| 亚洲av无一区二区三区久久| 99久久精品久久久久久清纯| 国精产品一区二区三区| 自拍偷拍欧美激情| 日韩精品一区二区在线播放| 欧美中文字幕亚洲一区二区va在线| 在线免费av片| 亚洲第一精品夜夜躁人人爽| 成人在线二区| 欧美国产视频日韩| www.精品国产| 国内精品久久久久久久果冻传媒| 欧美影院三区| 日韩av中文字幕第一页| 日本麻豆一区二区三区视频| 最新版天堂资源在线| 国产欧美一区二区精品性色| 久久久综合久久久| 欧美亚洲国产一区二区三区 | 性欧美1819sex性高清| 亚洲r级在线观看| 国产精品一区高清| av在线免费观看国产| 麻豆国产精品777777在线| 免费的av网站| 依依成人精品视频| 男人天堂av在线播放| 亚洲二区在线播放视频| 国产在线1区| 国产精品第一第二| 麻豆一区一区三区四区| 亚洲精品偷拍视频| 日韩国产精品久久| 亚洲精品乱码久久久久久久| 亚洲综合在线五月| 一级片视频网站| 亚洲色图色老头| 国产高清自产拍av在线| 99久久99久久| 91精品综合久久久久久久久久久| 国产综合免费视频| a美女胸又www黄视频久久| 国产女人18水真多毛片18精品| 欧美中文字幕一区| 韩国中文免费在线视频| 91sa在线看| 牛牛精品成人免费视频| 亚洲理论电影在线观看| 国产一区二区三区免费观看| 天堂网av2018| 在线观看日韩av先锋影音电影院| 天堂视频中文在线| 91tv亚洲精品香蕉国产一区7ujn| 成人福利一区| 野外做受又硬又粗又大视频√| 国产一区二区三区日韩| 国产精品 欧美激情| 3d成人动漫网站| 在线视频中文字幕第一页| 成人精品在线视频| 亚洲成人精品| 一级日本黄色片| 亚洲最大的成人av| 丰满岳乱妇国产精品一区| 欧美肥婆姓交大片| 爱高潮www亚洲精品| 日韩精品在线中文字幕| 99久精品国产| 国产精品自拍99| 亚洲欧美国产一区二区三区| 欧美三级网址| 亚洲电影一二三区| 极品尤物av久久免费看| 久久中文免费视频| 精品日韩欧美在线| av中文资源在线资源免费观看| 国产一区二区视频在线免费观看| 亚洲三级色网| 瑟瑟视频在线观看| 欧美亚洲国产一卡| a级影片在线| 国产精品yjizz| 国产精品毛片| 久久久久久国产免费a片| 欧美日韩国产成人在线免费| a级影片在线观看| 九九九九精品| 日韩av二区在线播放| 三级在线观看免费大全| 欧美成人性战久久| 在线视频cao| 亚洲人一区二区| 成人夜色视频网站在线观看| 无码人妻久久一区二区三区不卡| 综合欧美国产视频二区| 亚洲天堂中文字幕在线观看| 91免费视频网站在线观看| 国产精品日韩精品欧美在线| 成人av一区二区三区在线观看| 性欧美激情精品| 久久神马影院| www.com日本| 欧美综合久久久| 亚洲91av| 日日夜夜精品网站| 国产高清亚洲一区| 免费无码国产精品| 欧美超级乱淫片喷水| 狼人天天伊人久久| 欧美性受xxxxxx黑人xyx性爽| 亚洲国产一区视频| 91露出在线| 国新精品乱码一区二区三区18| 丝袜a∨在线一区二区三区不卡| 日本福利片在线观看| 亚洲男人天堂2019| 日韩有吗在线观看| 天天干在线影院| 亚洲大片一区二区三区| 香港伦理在线| 欧美日韩综合精品|