Python :: 特殊方法

文章推薦指數: 80 %
投票人數:10人

__new__、__init__ 方法 OPENHOME.CC Python |起步走 Hello,Python 簡介模組 IO/格式/編碼 |內建型態 數值 字串 清單 集合 字典 tuple |基本運算 變數 算術運算 比較、指定、邏輯運算 位元運算 |流程語法 if分支判斷 while迴圈、for迭代 forComprehension 初試match/case |函式入門 定義函式 一級函式、lambda運算式 初探變數範圍 yield產生器 |封裝 類別入門 屬性與方法 屬性名稱空間 特殊方法 callable物件 |繼承 共同行為與isa 使用enum列舉 多重繼承與Mixin |例外處理 使用try、except 例外繼承架構 raise例外 使用else、finally 使用withas 使用assert |模組/套件 管理模組名稱 模組路徑 使用套件 |metaprogramming __slots__、__abstractmethods__、__init_subclass__ __getattribute__、__getattr__、__setattr__、__delattr__ 裝飾器 描述器 type類別 metaclass super與mro GitHub Twitter Facebook LinkedIn 2DDesigns 3DDesigns Tags BuiltwithbyHugo HOME> Python> 封裝> 特殊方法 定義運算子 __new__、__init__方法 __del__方法 encapsulation objectoriented protocol 特殊方法 April26,2022 在Python中可以定義特定的__xxx__方法名稱,這是一種協定,用以定義某些特定行為,像是到目前為止看過的__init__、__str__、__repr__等方法,這邊要再來看看運算子、建構、刪除等行為的定義。

定義運算子 型態遇到運算子時應該具有的行為,是可以藉用特殊方法定義的,例如: >>>x=10 >>>y=3 >>>x+y 13 >>>x.__add__(y) 13 >>>x%3 1 >>>x.__mod__(3) 1 >>> 可以看到,+運算子實際上是由int的__add__方法定義,而%運算子是由int的__mod__方法定義,為了實際瞭解這些方法如何定義,先來個具體的範例,建立一個有理數類別,並定義其+、-、*、/等運算子的行為。

classRational: def__init__(self,numer,denom): self.numer=numer self.denom=denom def__add__(self,that): returnRational( self.numer*that.denom+that.numer*self.denom, self.denom*that.denom ) def__sub__(self,that): returnRational( self.numer*that.denom-that.numer*self.denom, self.denom*that.denom ) def__mul__(self,that): returnRational( self.numer*that.numer, self.denom*that.denom ) def__truediv__(self,that): returnRational( self.numer*that.denom, self.denom*that.numer ) def__str__(self): returnf'{self.numer}/{self.denom}' def__repr__(self): returnf'Rational({self.numer},{self.denom})' 在建立Rational實例之後,會經用__init__初始分子與分母,物件常見的+、-、*、/等操作,分別是由__add__、__sub__、__mul__、__truediv__定義(//是由__floordiv__定義),至於物件的字串描述,想要以1/2這樣的形式呈現運算結果,這定義在__str__方法之中,而__repr__方法的實作,採用'Rational(1,2)'這類的字串描述。

來看看REPL中的執行結果: >>>r1=Rational(1,2) >>>r2=Rational(2,3) >>>print(r1+r2) 7/6 >>>print(r1-r2) -1/6 >>>print(r1*r2) 2/6 >>>print(r1/r2) 3/6 >>> 〈算術運算〉曾經談過的decimal.Decimal類別,該類別建立的實例可以直接使用+、-、*、/進行運算,就是因為decimal.Decimal類別定義了相對應的方法。

類似地,如果想定義>、>=、>>classSome: ...def__del__(self): ...print('__del__') ... >>>s=Some() >>>s=None __del__ >>> 在這個例子中,原本被s參考的物件,由於s被指定了None,而不再有任何名稱參考了,就這個單純的例子來說,該物件馬上就被回收資源了,因此你看到__del__方法被執行了。

不過實際上,物件被回收的時機並不一定,也就無法預期__del__會被執行的時機,因此__del__中最好只定義一些不急著執行的資源清除行為,如果有些資源清除行為,希望能夠掌控執行的時機,那麼最好定義其他方法,並在必要時明確呼叫它。

想要知道還有哪些方法的話,可以看看〈Specialmethodnames〉。



請為這篇文章評分?