Python中的特殊方法以及應用詳解

2022-10-06 00:54:11 字數 3059 閱讀 6762

前言

python 中的特殊方法主要是為了被直譯器呼叫的,因此應該盡量使用 len(my_object) 而不是 my_object.__len__() 這種寫法。在執行 len(my_object) 時,python 直譯器會自行呼叫 my_object 中實現的 __len__ 方法。

除非有大量的元程式設計存在,直接呼叫特殊方法的頻率應遠小於實現它們的次數。

模擬數值型別

可以通過在自定義物件中實現 __add__ 和 __mul__ 等特殊方法 ,令其支援 +、* 等運算子。

如下面的模擬向量的 vector 類:

# vector.py

from math import hypot

class ve程式設計客棧ctor:

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

self.x = x

self.y = y

def __repr__(self):

return f'vector(, )'

def __abs__(self):

return hypot(self.x, self.y)

def __bool__(self):

return bool(self.x or self.y)

def __add__(self, other):

return vector(self.x + other.x, self.y + other.y)

def __mul__(self, scalar):

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

執行效果如下:

>>> from vector import vector

>>> v1 = vector(2, 4)

>>> v2 = vector(2, 1)

>>> v1 + v2

vector(4, 5)

>>> v = vector(3, 4)

>>> abs(v)

5.0>>> v * 3

vector(9, 12)

物件的字串表示

python 有乙個 repr 內建函式,能把乙個物件用字串的形式表示出來。實際上這種www.cppcns.com字串表達是通過物件內部的 __repr__ 特殊方法定義的。預設情況下,在控制台裡檢視某個物件時,輸出的字串一般是 這種形式。

__repr__ 返回的字串應該準確、無歧義,並盡可能表示出該物件是如何建立的。比如前面的 vector 物件,其 __repr__ 中定義的字串形式類似於 vector(3, 4),和物件初始化的語法非常近似。

__repr__ 和 __str__ 的區別在於,__str__ 是在向物件應用 str() 函式(或者用 print 函式列印某個物件)時被呼叫。其返回的字串對終端使用者更友好。

如果只想實現其中乙個特殊方法,__repr__ 應該是更優的選擇。在物件沒有實現 __str__ 方法的情況下,python 直譯器會用 __repr__ 代替。

# myclass.py

class myclass:

def __repr__(self):

return 'myclass'

def __str__(self):

return 'this is an instance of myclass'

>>> from myclass import myclass

>>> my = myclass()

>>> my

myclass

>>> print(my)

this is an instance of myclass

自定義布林值

python 裡有 bool 型別,但實際上任何物件都可以用在需要 bool 型別的上下文(比如 if 或 while 語句)中。為了判斷某個值 x 的真假,python 會呼叫 bool(x) 返回 true 或 false。

預設情況下,自定義類的例項總是為真。除非這個類對於 __bool__ 或 __len__ 方法有自己的實現。

bool(x) 實際上呼叫了物件 x 中的 __bool__ 方法。如不存在 __bool__ 方法,則 bool(x) 會嘗試呼叫 x.__len__(),返回 0 則為 false,否則為 true。

# boolclass.py

class boolclass:

def __init__(self):

self.list =

def add(self, item):

self.list.append(item)

def __len__(self):

return len(self.list)

>>> from boolclass import boolclass

>>> b = boolclass()

>>> len(b)

0>>> bool(b)

false

>>> b.add(1)

>>> len(b)

1>>> bool(b)

true

# boolclass.py

class boolclass:

def __init__(self):

self.list =

def add(self, item):

self.list.append(item)

def __len__(self):

return len程式設計客棧(self.list)

def __bool__(self):

return bool(sum(self.lislpfllakpeit))

>>> from boolclass import boolclass

>>> b = boolclass()

>>> b.add(1)

>>> len(b)

1>>> bool(b)

true

>>> b.add(-1)

>>> len(b)

2>>> bool(b)

false

參考資料

fluent python

總結

python類中的特殊方法

python類特殊方法 方法功能說明 new 類的靜態方法,用於確定是否建立物件 init 建構函式,生成物件時呼叫 del 析構函式,釋放物件時呼叫 add sub mul truediv floordiv mod pow repr 列印,轉換 setitem 按照索引賦值 getitem 按照索...

python中的特殊方法 getitem

python中的特殊方法 getitem 原創solarzhou 最後發布於2019 07 19 14 08 37 閱讀數 1240 收藏 展開特殊方法 getitem python的特殊方法 getitem 主要作用是可以讓物件實現迭代功能。我們通過乙個例項來說明。定義乙個sentence類,通過...

python中的特殊方法的含義

表 13.4 用來定製類的特殊方法 基本定製型 描述 c.init self arg1,構造器 帶一些可選的引數 c.new self arg1,構造器 帶一些可選的引數 通常用在設定不變資料型別的子類。c.del self 解構器 c.str self 可列印的字元輸出 內建 str 及 prin...