自定類別

一個物件的建立需要兩個步驟 , 首先必須建立一個物件 , 然後初始化該物件 . 有些物件導向語言會把這兩個步驟合併成一個 , 但 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

若希望避免不恰當的比較 , 有三個辦法可以採取

  1. assert isinstance(other, MyClass)
  2. if not isinstance(other, MyClass): raise TypeError
  3. 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

results matching ""

    No results matching ""