天天看點

[2]Python面向對象-【8】特殊方法

Python中的特殊方法是一類以雙下劃線(__)開頭和結尾的方法,也稱為魔術方法。這些方法在Python中具有特殊的用途和含義,可以讓我們自定義類的行為和操作。

本文将介紹Python中的一些特殊方法及其用法。

__init__方法

__init__是Python中最常用的特殊方法之一,也被稱為構造函數。當我們建立一個類的執行個體時,__init__方法會被自動調用,用于初始化對象的屬性。

下面是一個簡單的例子:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
           

在這個例子中,__init__方法的作用是将name和age屬性初始化為傳入的參數。

__del__(self)方法

__del__方法用于定義對象的删除操作,在對象被删除時自動調用。

下面是一個例子:

class Person:
    def __del__(self):
        print("Person object deleted")
           

在這個例子中,__del__方法在對象被删除時列印一條消息。

__getitem__(self, key)方法

該方法在類中實作後,對象就可以像使用清單或字典一樣使用下标或者鍵擷取其中的元素了,例如:

class MyClass:
    def __init__(self):
        self.data = [1, 2, 3, 4, 5]
    
    def __getitem__(self, key):
        return self.data[key]

my_obj = MyClass()
print(my_obj[0]) # 輸出 1
print(my_obj[3]) # 輸出 4
           

__setitem__(self, key, value)方法

該方法在類中實作後,對象就可以像使用清單或字典一樣使用下标或者鍵設定其中的元素了,例如:

class MyClass:
    def __init__(self):
        self.data = [1, 2, 3, 4, 5]
    
    def __setitem__(self, key, value):
        self.data[key] = value

my_obj = MyClass()
my_obj[2] = 6
print(my_obj.data) # 輸出 [1, 2, 6, 4, 5]
           

__delitem__(self, key) 方法

__delitem__() 方法用于從對象中删除一個索引值。當你從對象中删除一個索引值時,Python 就會嘗試調用該方法。你可以通過 key 參數來删除索引的值。

class MyList:
    def __init__(self, data):
        self.data = data
        
    def __delitem__(self, key):
        del self.data[key]

my_list = MyList([1, 2, 3, 4, 5])
del my_list[2]
print(my_list.data)  # 輸出 [1, 2, 4, 5]
           

__len__(self)方法

該方法在類中實作後,對象就可以像使用len()函數一樣使用len()擷取其長度了,例如:

class MyClass:
    def __init__(self):
        self.data = [1, 2, 3, 4, 5]
    
    def __len__(self):
        return len(self.data)

my_obj = MyClass()
print(len(my_obj)) # 輸出 5
           

__str__(self)方法

該方法在類中實作後,可以通過str()函數或者print()函數輸出對象時,自定義輸出的字元串表示形式,例如:

class MyClass:
    def __init__(self, name):
        self.name = name
    
    def __str__(self):
        return f"My name is {self.name}"

my_obj = MyClass("Tom")
print(str(my_obj)) # 輸出 "My name is Tom"
print(my_obj) # 輸出 "My name is Tom"
           

__repr__(self)方法

該方法與__str__(self)類似,不同的是,它在對象被列印時,如果沒有定義__str__(self)方法,或者使用repr()函數調用對象時,就會輸出該方法傳回的字元串表示形式,例如:

class MyClass:
    def __init__(self, name):
        self.name = name
    
    def __repr__(self):
        return f"MyClass({self.name})"

my_obj = MyClass("Tom")
print(repr(my_obj)) # 輸出 "MyClass(Tom)"
print(my_obj) # 輸出 "MyClass(Tom)"
           

__call__方法

__call__方法用于将對象當作函數調用。

class Adder:
    def __call__(self, a, b):
        return a + b
           

在這個例子中,Adder對象可以像函數一樣調用,傳回兩個數的和:

>>> adder = Adder()
>>> adder(1, 2)
3
           

以下是 Python 官方文檔中列出的常見特殊方法(魔術方法):

  1. __init__(self[, ...]): 構造函數,在對象建立時被調用。
  2. __del__(self): 析構函數,在對象銷毀時被調用。
  3. __repr__(self): 用于計算對象的“官方”字元串表示形式。
  4. __str__(self): 用于計算對象的“非正式”或“使用者友好”字元串表示形式。
  5. __bytes__(self): 用于計算對象的二進制形式表示。
  6. __format__(self, format_spec): 用于格式化對象的字元串表示形式。
  7. __lt__(self, other): 用于“小于”比較。
  8. __le__(self, other): 用于“小于等于”比較。
  9. __eq__(self, other): 用于“等于”比較。
  10. __ne__(self, other): 用于“不等于”比較。
  11. __gt__(self, other): 用于“大于”比較。
  12. __ge__(self, other): 用于“大于等于”比較。
  13. __hash__(self): 用于計算對象的哈希值。
  14. __bool__(self): 用于計算對象的布爾值。
  15. __len__(self): 用于計算對象的長度。
  16. __getitem__(self, key): 用于實作索引操作。
  17. __setitem__(self, key, value): 用于實作指派操作。
  18. __delitem__(self, key): 用于實作删除操作。
  19. __iter__(self): 用于疊代對象。
  20. __reversed__(self): 用于反轉對象。
  21. __contains__(self, item): 用于判斷對象是否包含一個元素。
  22. __call__(self[, args...]): 用于使一個對象變成可調用的。
  23. __enter__(self): 用于進入上下文管理器。
  24. __exit__(self, exc_type, exc_value, traceback): 用于離開上下文管理器。
  25. __await__(self): 用于支援異步協定。
  26. __aiter__(self): 用于異步疊代。
  27. __anext__(self): 用于異步疊代器。
  28. __get__(self, instance, owner): 用于實作描述符。
  29. __set__(self, instance, value): 用于實作描述符。
  30. __delete__(self, instance): 用于實作描述符。

請注意,這些特殊方法可能會與一些标準庫和第三方庫中的其他函數和方法名稱沖突。是以,建議在編寫自己的代碼時,盡量不要使用 Python 中已有的名稱。