Python :: 特殊方法
文章推薦指數: 80 %
__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〉。
延伸文章資訊
- 1一文搞懂python中的__init__的意思及使用场景
__init__普通用法. init只是用来初始化值,但都需要新定义方法来返回这个参数!!! class ClassName ...
- 2[Python] CLASS(類別) + __init__ 用法
__init__ import os import sys import copy from functools import reduce #物件導向的程式設計 ! ''' 接下來,來介紹一個...
- 3關於Python的類別(Class)...基本篇 - 張凱喬
名字意思是名字是動物的屬性所以你不能用王大明.鉛筆來解釋class的概念 ... __name class Animal(): def __init__(self, name): self.__...
- 4Python中__init__的理解 - IT人
而__init__函式(方法)支援帶引數類的初始化,也可為宣告該類的屬性(類中的變數)。__init__函式(方法)的第一個引數必須為self,後續引數為自己定義。
- 5Python中__init__的通俗解释是什么? - 知乎