在 Python 中,魔法函數(Magic Methods)也稱為雙下劃線方法(Dunder Methods),是指那些名字以雙下劃線開頭和結尾的特殊方法。 這些方法可以讓您的自定義類實現一些特定的行為,從而與 Python 的內置類型和操作進行交互。
例如,`__init__` 方法用于對象的初始化,`__str__` 方法用于定義對象的字符串表示形式,`__add__` 方法用于實現對象的加法操作等。
以下是一些常見魔法函數的示例及其作用:
1. `__init__`:在創建對象時自動調用,用于初始化對象的屬性。?
class MyClass:def __init__(self, value):self.value = value
?例子:創建“Student”類,對應邏輯關系:
Student→self→{name,age,grade}(三個邏輯分支)
# 創建學生對象
student1 = Student("Alice", 12, 6)
#類的實例化
class Student:def __init__(self, name, age, grade):self.name = nameself.age = ageself.grade = grade# 創建學生對象
student1 = Student("Alice", 12, 6)
print(student1.name)
print(student1.age)
print(student1.grade)
?
2. `__str__`:定義對象的字符串表示,當使用 `str()` 函數或在打印對象時調用。
class MyClass:def __str__(self):return f"MyClass with value: {self.value}"
例子:
class MyClass:def __init__(self, value):self.value = valuedef __str__(self):return f"My value is {self.value}"my_object = MyClass(42)
print(str(my_object))
在這段代碼中,`42` 這個值的傳遞關系如下: 當創建對象 `my_object = MyClass(42)` 時,`42` 作為參數被傳遞給了 `MyClass` 類的 `__init__` 方法。 在 `__init__` 方法內部,`42` 被賦值給了對象的 `self.value` 屬性,使得該對象具有了 `value` 屬性且其值為 `42` 。 當執行 `str(my_object)` 或 `print(my_object)` 時,會調用 `__str__` 方法,在 `__str__` 方法中通過 `self.value` 訪問到了之前存儲的 `42` 值,并將其用于生成返回的字符串 `My value is 42` 。 簡單來說,`42` 從創建對象時作為參數傳入,被存儲在對象的屬性中,然后在需要時被 `__str__` 方法獲取并使用。 ?
3. `__add__`:實現對象的加法操作。
class MyNumber:def __init__(self, num):self.num = numdef __add__(self, other):return MyNumber(self.num + other.num)
例子:
class MyNumber:def __init__(self, num):self.num = numdef __add__(self, other):return MyNumber(self.num + other.num)num1 = MyNumber(5)
num2 = MyNumber(3)
result = num1 + num2
print(result.num)
?
4. `__len__`:用于 `len()` 函數獲取對象的長度。
class MyList:def __init__(self, items):self.items = itemsdef __len__(self):return len(self.items)
例子:
class MyList:def __init__(self, items):self.items = itemsdef __len__(self):return len(self.items)my_list = MyList([1, 2, 3, 4, 5])
print(len(my_list))
通過合理地定義魔法函數,可以使自定義類的行為更加自然和符合 Python 的習慣用法。
以下是一些常見的 Python 魔法函數及它們的作用:
1. `__init__(self,...)`:對象初始化函數,在創建對象時調用,用于進行對象的初始化操作。
2. `__str__(self)`:直接打印對象的實現方法,被`print`函數調用,返回對象的字符串表示。
3. `__new__(cls, *args, **kwargs)`:在對象實例化時首先被調用,用于創建并返回實例對象。
4. `__unicode__(self)`:在一個對象上調用`unicode()`時被調用,常用于 Django 模型中處理字符串。
5. `__call__(self, *args, **kwargs)`:允許一個類的實例像函數一樣被調用。
6. `__len__(self)`:定義當被`len()`調用時的行為,需要返回一個整數,表示對象的長度。
7. `__repr__(self)`:用于將值轉化為供解釋器讀取的形式,如果對象沒有適于人閱讀的解釋形式,`str()`會返回與`repr()`相同的內容。
8. `__setattr__(self, name, value)`:可以設置對象的屬性。
9. `__getattr__(self, name)`:獲取對象屬性,在屬性沒有找到時被調用。
10. `__getattribute__(self, name)`:無條件地獲取對象屬性,可用于做一些控制,但定義后`__getattr__`不再自動調用,除非顯式調用。
11. `__delattr__(self, name)`:用于刪除對象的屬性。
12. `__setitem__(self, key, value)`:實現該函數后,可以以下標的方式給對象賦值。
13. `__getitem__(self, key)`:可以使對象支持以下標的方式獲取值。
14. `__delitem__(self, key)`:支持以下標方式刪除對象數據。
15. `__iter__(self)`:只要定義了該方法,對象就可以使用迭代器訪問,意味著可以迭代自定義的對象。
16. `__del__(self)`:析構器或回收器,在對象引用數降到 0 時執行,但執行時間可能不確定,一般不推薦使用,可用于實現一些非緊急但必須要做的事。
17. `__eq__(self, other)`:定義等于號的行為,用于判斷兩個對象是否相等。
18. `__lt__(self, other)`:定義小于號的行為,用于判斷一個對象是否小于另一個對象。
19. `__gt__(self, other)`:定義大于號的行為,用于判斷一個對象是否大于另一個對象。
20. `__add__(self, other)`:定義加法操作的行為。
21. `__sub__(self, other)`:定義減法操作的行為。
22. `__mul__(self, other)`:定義乘法操作的行為。
23. `__truediv__(self, other)`:定義真除法操作的行為。
24. `__floordiv__(self, other)`:定義整數除法操作的行為。
25. `__mod__(self, other)`:定義取模算法的行為。
26. `__pow__(self, other, modulo)`:定義當被`power()`調用或 `**` 運算時的行為。
27. `__radd__(self, other)`等(反運算魔法方法):當左操作數不支持相應的操作時被調用,例如`__radd__`在執行`other + self`時被調用。
28. `__iadd__(self, other)`等(增量賦值運算魔法方法):定義相應的增量賦值運算行為,如`__iadd__`定義`+=`的行為。
29. `__neg__(self)`:定義正號的行為。
30. `__pos__(self)`:定義負號的行為。
31. `__abs__(self)`:定義當被`abs()`調用時的行為。
32. `__invert__(self)`:定義按位求反的行為。
33. `__complex__(self)`:定義當被`complex()`調用時的行為,需要返回恰當的值。
34. `__int__(self)`:定義當被`int()`調用時的行為,需要返回恰當的值。
35. `__float__(self)`:定義當被`float()`調用時的行為,需要返回恰當的值。
36. `__round__(self, n)`:定義當被`round()`調用時的行為,需要返回恰當的值。
37. `__index__(self)`:當對象應用在切片表達式中時,實現強制轉換;如果定義了該方法,則也需要定義`__int__`且返回相同的值。
魔法函數可以讓自定義類具有更豐富的行為,類似于 Python 內置類型的操作方式,從而使代碼更加簡潔、易讀和可維護。它們的具體使用方式和效果取決于具體的需求和上下文。在實際編程中,根據需要選擇合適的魔法函數來定制類的行為。