自定類別
一個物件的建立需要兩個步驟 , 首先必須建立一個物件 , 然後初始化該物件 . 有些物件導向語言會把這兩個步驟合併成一個 , 但 Python 仍舊維持兩個步驟 . 當一個物件被建立時 , 首先呼叫 __new__()
建立物件 , 然後呼叫 __init__()
初始化物件 .
一個物件的銷毀會呼叫 __del__()
, 理論上如此 . 實際上 __del__()
可能永遠不會被呼叫 , 即使在程式終止的時候 . 當執行 del x 的時候 , 幕後所發生的情況是物件的參照 x 會被刪除 , 而且被 x 所參照的物件的物件計數器會被減一 , 只有當該計數器的值為零時 , __del__()
才有可能被呼叫 , 但 Python 並不保證 . 所以不應該使用它來作為資源的釋放 , 例如關閉檔案或關閉資料庫連線 . 如果需要釋放資源有兩種方法可以採取 : (1) try ... finally , (2) 使用環境物件搭配 with (這個方法比較好) .
判斷物件的類別可以使用 type() 函式 , 例如 type(x)
判斷物件是否屬於某個類別可以使用 isinstance() 函式 , 例如 isinstance(x, int)
類別一 (與類別二等效)
class MyClass:
suite
類別二 (與類別一等效)
class MyClass(object):
suite
類別三
class MyClass:
class_var = 1
類別四
class MyClass:
def __init__(self):
self.instance_var = 1
類別五
class MyClass:
def __init__(self):
super().__init__()
類別六
class MyClass:
def __lt__(self, other):
suite
def __le__(self, other):
suite
def __eq__(self, other):
suite
def __ne__(self, other):
suite
def __ge__(self, other):
suite1.
def __gt__(selft, other):
suite
若希望避免不恰當的比較 , 有三個辦法可以採取
- assert isinstance(other, MyClass)
- if not isinstance(other, MyClass): raise TypeError
- if not isinstance(other, MyClass): return NotImplemented
在第三個辦法中 , Python 會嘗試呼叫 other.__eq__(self)
看看 other 物件的型別是否支援支援與 MyClass 型別的物件進行比較 , 若找不到這樣的方法 , 或該方法仍舊傳回 NotImplemented , Python 會放棄並引發 TypeError .
類別七
class MyClass:
def __repr__(self):
suite
def __str__(self):
suite
類別八
class MyClass(ParentClass1, ParentClass2):
suite
基本的特殊方法
特殊方法 | 用法 | 說明 |
---|---|---|
__bool__(self) |
bool(x) | 可用於 if x: ... |
__format__(self, format_spec) |
"{0}".format(x) | 用於替自訂類別提供 str.format() 支援 |
__hash__(self) |
hash(x) | 若提供 , x 可做為字典的一個鍵 , 或保存在一個集合中 |
__init__(self, args) |
x = X(args) | 初始化物件 |
__new__(cls, args) |
x = X(args) | 建立物件 |
__repr__(self) |
repr(x) ascii(x) | 傳回 x 的字串表示法 , eval(repr(x)) == x |
__str__(self) |
str(x) | 以人類可理解的形式傳回 x 的字串表示法 |
數值與逐位元特殊方法
特殊方法 | 用法 | 說明 |
---|---|---|
__abs__(self) |
abs(x) | - |
__float_(self) |
float(x) | - |
__index__(self) |
bin(x) oct(x) hex(x) | - |
__pos__(self) |
+x | - |
__add__(self, other) |
x + y | - |
__iadd__(self, other) |
x += y | - |
__radd__(self, other) |
y + x | - |
__mul__(self, other) |
x * y | - |
__imul__(self, other) |
x *= y | - |
__rmul__(self, other) |
y * x | - |
__floordiv__(self, other) |
x // y | - |
__ifloordiv__(self, other) |
x //= y | - |
__rfloordiv__(self, other) |
y // x | - |
__divmod__(self, other) |
divmod(x, y) | - |
__pow__(self, other) |
x ** y | - |
__ipow__(self, other) |
x **= y | - |
__rpow__(self, other) |
y ** x | - |
__xor__(self, other) |
x ^ y | - |
__ixor__(self, other) |
x ^= y | - |
__rxor__(self, other) |
y ^ x | - |
__lshift__(self, other) |
x << y | - |
__ilshift__(self, other) |
x <<= y | - |
__rlshift__(self, other) |
y << x | - |
__complex__(self, other) |
complex(x) | - |
__int__(self, other) |
int(x) | - |
__round__(self, other) |
Round(x, digits) | - |
__neg__(self, other) |
-x | - |
__sub__(self, other) |
x - y | - |
__isub__(self, other) |
x -= y | - |
__rsub__(self, other) |
y - x | - |
__mod__(self, other) |
x % y | - |
__imod__(self, other) |
x %= y | - |
__rmod__(self, other) |
y % x | - |
__truediv__(self, other) |
x / y | - |
__itruediv__(self, other) |
x /= y | - |
__rtruediv__(self, other) |
y / x | - |
__rdivmod__(self, other) |
divmod(y, x) | - |
__and__(self, other) |
x & y | - |
__iand__(self, other) |
x &= y | - |
__rand__(self, other) |
y & x | - |
__rshift__(self, other) |
x >> y | - |
__irshift__(self, other) |
x >>= y | - |
__rrshift__(self, other) |
y >> x | - |
__invert__(self, other) |
~x | - |
集合的特殊方法
特殊方法 | 用法 | 說明 |
---|---|---|
__contains__(self, y) |
y in x | 如果 y 位於序列 x 中 , 或如果 y 是映射 x 中的一個鍵 , 則回傳 True |
__delitem__(self, k) |
del x[k] | 刪除序列 x 的第 k 個資料項 , 或映射 x 的 k 鍵 |
__getitem__(self, k) |
x[k] | 回傳序列 x 的第 k 個資料項 , 或映射 x 的 k 鍵 |
__iter__(self) |
for y in x: pass | 為序列 x 的資料項 , 或映射 x 的鍵回傳一個迭代器 |
__len__(self) |
len(x) | 回傳 x 中資料項的數目 |
__reversed__(self) |
reversed(x) | 為序列 x 的資料項 , 或映射 x 的鍵回傳一個反向的迭代器 |
__setitem__(self, k, v) |
x[k] = v | 將序列 x 的第 k 個資料項 , 或映射 x 的 k 鍵的值設為 v |