python魔法方法

2021-10-01 16:10:40 字數 2514 閱讀 3745

python魔術方法是特殊方法的暱稱。它是簡單而又強大,為了被python直譯器呼叫而存在的方法。python提供豐富的元物件協議,讓語言的使用者和核心開發者擁有並使用同樣的工具

例子引用《流暢的python》- 一摞python風格的紙牌

import collections

# namedtuple用來構建只有少數屬性但是沒有方法的物件

card = collections.namedtuple('card', ['rank', 'suit'])

class frenchdeck:

ranks = [str(n) for n in range(2, 11)] + list('jqka')

suits = 'spades diamonds clubs hearts'.split()

def __init__(self):

self._cards = [card(rank, suit) for suit in self.suits for rank in self.ranks]

def __len__(self):

return len(self._cards)

def __getitem__(self, position):

return self._cards[position]

__getitem__方法將使自定義類物件有些比較常見、基礎的能力:

1.可以通過下標獲取值

deck = frenchdeck()

print(deck[1])

2.可以隨機選出乙個值

from random import choice

print(deck)

3.可以對例項物件切片

print(deck[:3])

4.可以對例項物件執行遍歷操作

備註:__getitem__方法使例項物件變成可迭代物件

for card in deck:

print(card)

for card in reversed(deck):

print(card)

5.可以使用in關鍵字執行布林判斷

備註:沒有實現__contains__方法的集合型別中,in運算子會按順序做一次迭代搜尋

print(card('q', 'hearts') in deck)

引用例子:乙個簡單的二維向量類

from math import hypot

class vector:

def __init__(self, x=0, y=0):

self.x = x

self.y = y

def __repr__(self):

return 'vector(%r, %r)' % (self.x, self.y)

def __abs__(self): # abs函式返回函式的絕對值

return hypot(self.x, self.y) # hypot返回歐幾里德範數,如直角三角形的斜邊長

def __bool__(self):

return bool(abs(self))

def __add__(self, other):

x = self.x + other.x

y = self.y + other.y

return vector(x, y)

def __mul__(self, scalar):

return vector(self.x * scalar, self.y * scalar)

__repr__

內建物件中,雙下repr方法用來返回物件的字串表現形式,如果沒有此方法,我們列印的資訊可能只有物件類和記憶體位址。

__repr__和__str__的區別在於,後者是str()執行時,或是用print()函式列印物件時才被呼叫,並且的它的返回值對終端使用者更友好。如果乙個物件沒有__str__方法,而python又需要呼叫它時,直譯器會用__repr__作為代替

__add__和__mul__

使向量類例項物件可以使用算術運算子+和*進行運算。並且都是不改變源物件的前提下,計算並返回新物件。遵循中綴運算子的基本原則:不改變操作物件,而是產出乙個新的值

__bool__

儘管python裡有bool型別,但實際上任何物件都可以用於需要布林值的上下文中(比如if或while語句,或者and、or和not運算子)。python通過bool()函式來對物件判斷真假。直譯器預設呼叫__bool__方法,當此函式未定義時,會嘗試呼叫__len__方法

v1 = vector(2, 4)

v2 = vector(2, 1)

print(v1 + v2) # vector(4, 5)

v = vector(3, 4)

print(abs(v)) # 5.0

print(v * 3) # vector(9, 12)

print(abs(v * 3)) # 15.0

Python魔法方法 基本的魔法方法

new cls 1.new 是在乙個物件例項化時候所呼叫的第乙個方法 2.他的第乙個引數是這個類,其他的引數是用來直接傳遞給 init 方法 3.new 決定是否使用該 init 方法,因為.new 可以直接呼叫其他類的構造方法,或者返回別的例項物件來作為本類的例項,如果 new 沒有返回例項物件,...

python 魔法方法

魔法方法具有一定的特徵 new cls class capstr str def new cls,string 修改新類裡的new方法,需傳入乙個引數 string string.upper return str.new cls,string 用父類裡的new方法進行返回,直接飯後構造後的物件def...

Python 魔法方法

魔法方法總是被雙下劃線包圍,例如 init 魔法方法是物件導向的 python 的一切,如果你不知道魔法方法,說明你還沒能意識到物件導向的 python 的強大。魔法方法的 魔力 體現在它們總能夠在適當的時候被自動呼叫。魔法方法的第乙個引數應為cls 類方法 或者self 例項方法 若 new 沒有...