最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從入門到精通的Python魔術(shù)方法(Magic Methods)完全指南

 更新時間:2025年07月17日 08:38:41   作者:盛夏綻放  
這篇文章主要詳細(xì)介紹了Python中特殊的魔術(shù)方法,用于實現(xiàn)各種內(nèi)置操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

本文全面介紹了Python中特殊的魔術(shù)方法,這些以雙下劃線開頭和結(jié)尾的方法(如__init__)為類提供了"魔法"般的行為。主要內(nèi)容包括:

基礎(chǔ)知識:魔術(shù)方法由Python自動調(diào)用,用于實現(xiàn)各種內(nèi)置操作,如對象初始化(init)、字符串表示(str, repr)等。

核心分類:

  • 對象生命周期方法(new, del)
  • 比較運算符(eq, __lt__等)
  • 算術(shù)運算(add, __mul__等)
  • 容器模擬(len, __getitem__等)

實際應(yīng)用:通過豐富的代碼示例展示了如何利用魔術(shù)方法實現(xiàn)自定義類的高級行為,如向量運算、購物車容器等。

魔術(shù)方法使Python的面向?qū)ο缶幊谈訌姶蠛挽`活,是構(gòu)建專業(yè)級Python類的關(guān)鍵工具。

魔術(shù)方法(Magic Methods)是Python面向?qū)ο缶幊讨械奶厥夥椒?,它們賦予類"魔法"般的行為。本文將全面解析Python中的魔術(shù)方法,通過豐富的示例和實際應(yīng)用場景,帶你深入理解這一重要概念。

一、魔術(shù)方法基礎(chǔ)

1. 什么是魔術(shù)方法

魔術(shù)方法是以雙下劃線開頭和結(jié)尾的特殊方法(如__init__),Python會在特定時機自動調(diào)用它們。它們不是用來直接調(diào)用的,而是讓類能夠支持Python的各種內(nèi)置操作。

class MyClass:
    def __init__(self, value):
        self.value = value
    
    def __str__(self):
        return f"MyClass with value: {self.value}"

obj = MyClass(42)
print(obj)  # 自動調(diào)用__str__: "MyClass with value: 42"

2. 魔術(shù)方法的特點

  • 命名規(guī)則:雙下劃線開頭和結(jié)尾,如__method__
  • 自動調(diào)用:由Python解釋器在特定情況下調(diào)用
  • 豐富功能:實現(xiàn)運算符重載、對象生命周期控制等
  • 性能優(yōu)化:比普通方法調(diào)用更快(直接由解釋器處理)

二、常用魔術(shù)方法分類詳解

1. 對象創(chuàng)建與初始化

方法調(diào)用時機典型用途
__new__創(chuàng)建實例時控制實例創(chuàng)建過程(單例模式等)
__init__初始化實例時設(shè)置初始屬性
__del__對象銷毀時清理資源
class Resource:
    def __new__(cls, *args, **kwargs):
        print("__new__ called - creating instance")
        instance = super().__new__(cls)
        return instance
    
    def __init__(self, name):
        print("__init__ called - initializing")
        self.name = name
    
    def __del__(self):
        print(f"__del__ called - cleaning up {self.name}")

res = Resource("File")  # 輸出: __new__ called → __init__ called
del res                 # 輸出: __del__ called

2. 對象表示與字符串轉(zhuǎn)換

方法調(diào)用時機區(qū)別
__str__str(obj), print(obj)用戶友好的字符串表示
__repr__repr(obj), 交互式環(huán)境明確的、可eval的表示
__format__format(obj), f-string自定義格式化輸出
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __str__(self):
        return f"({self.x}, {self.y})"
    
    def __repr__(self):
        return f"Point({self.x}, {self.y})"
    
    def __format__(self, format_spec):
        if format_spec == 'r':
            return f"{self.x}×{self.y}"
        return str(self)

p = Point(3, 4)
print(str(p))      # (3, 4)
print(repr(p))     # Point(3, 4)
print(f"{p}")      # (3, 4)
print(f"{p:r}")    # 3×4

3. 比較運算符重載

方法對應(yīng)運算符
__lt__<
__le__<=
__eq__==
__ne__!=
__gt__>
__ge__>=
class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score
    
    def __eq__(self, other):
        return self.score == other.score
    
    def __lt__(self, other):
        return self.score < other.score
    
    def __le__(self, other):
        return self.score <= other.score

alice = Student("Alice", 85)
bob = Student("Bob", 90)
print(alice < bob)   # True
print(alice == bob)  # False

4. 算術(shù)運算符重載

方法對應(yīng)運算符反向方法
__add__+__radd__
__sub__-__rsub__
__mul__*__rmul__
__truediv__/__rtruediv__
__floordiv__//__rfloordiv__
__mod__%__rmod__
__pow__**__rpow__
class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)
    
    def __mul__(self, scalar):
        if isinstance(scalar, (int, float)):
            return Vector(self.x * scalar, self.y * scalar)
        return NotImplemented
    
    def __rmul__(self, scalar):
        return self.__mul__(scalar)
    
    def __str__(self):
        return f"Vector({self.x}, {self.y})"

v1 = Vector(2, 3)
v2 = Vector(5, 7)
print(v1 + v2)  # Vector(7, 10)
print(v1 * 3)   # Vector(6, 9)
print(2 * v1)   # Vector(4, 6) (調(diào)用__rmul__)

5. 容器類型模擬

方法用途
__len__len(obj)
__getitem__obj[key]
__setitem__obj[key] = value
__delitem__del obj[key]
__contains__item in obj
__iter__迭代對象時
class ShoppingCart:
    def __init__(self):
        self.items = []
    
    def __len__(self):
        return len(self.items)
    
    def __getitem__(self, index):
        return self.items[index]
    
    def __setitem__(self, index, value):
        self.items[index] = value
    
    def __delitem__(self, index):
        del self.items[index]
    
    def __contains__(self, item):
        return item in self.items
    
    def __iter__(self):
        return iter(self.items)
    
    def add(self, item):
        self.items.append(item)

cart = ShoppingCart()
cart.add("蘋果")
cart.add("香蕉")
cart.add("橙子")

print(len(cart))        # 3
print(cart[1])          # 香蕉
print("蘋果" in cart)   # True

for item in cart:       # 迭代
    print(item)

6. 上下文管理器

方法調(diào)用時機
__enter__進(jìn)入with塊時
__exit__退出with塊時
class Timer:
    def __enter__(self):
        import time
        self.start = time.time()
        return self
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        import time
        self.end = time.time()
        print(f"耗時: {self.end - self.start:.2f}秒")
    
    def elapsed(self):
        return self.end - self.start

with Timer() as t:
    # 執(zhí)行一些操作
    sum(range(1000000))

# 自動輸出: 耗時: x.xx秒

7. 可調(diào)用對象

方法調(diào)用時機
__call__obj()形式調(diào)用時
class Adder:
    def __init__(self, n):
        self.n = n
    
    def __call__(self, x):
        return self.n + x

add5 = Adder(5)
print(add5(3))  # 8 (實例像函數(shù)一樣調(diào)用)

三、高級魔術(shù)方法

1. 屬性訪問控制

方法調(diào)用時機
__getattr__訪問不存在的屬性時
__getattribute__訪問任何屬性時
__setattr__設(shè)置屬性時
__delattr__刪除屬性時
class AttributeLogger:
    def __init__(self):
        self.data = {}
    
    def __getattr__(self, name):
        print(f"訪問不存在的屬性: {name}")
        return None
    
    def __setattr__(self, name, value):
        print(f"設(shè)置屬性: {name} = {value}")
        super().__setattr__(name, value)
    
    def __delattr__(self, name):
        print(f"刪除屬性: {name}")
        super().__delattr__(name)

obj = AttributeLogger()
obj.x = 10      # 設(shè)置屬性: x = 10
print(obj.x)    # 10
print(obj.y)    # 訪問不存在的屬性: y → None
del obj.x       # 刪除屬性: x

2. 描述符協(xié)議

方法調(diào)用時機
__get__獲取描述符值時
__set__設(shè)置描述符值時
__delete__刪除描述符值時
class Celsius:
    def __get__(self, instance, owner):
        return instance._celsius
    
    def __set__(self, instance, value):
        if value < -273.15:
            raise ValueError("溫度不能低于絕對零度")
        instance._celsius = value

class Temperature:
    celsius = Celsius()  # 描述符
    
    def __init__(self, celsius):
        self.celsius = celsius  # 通過描述符賦值

temp = Temperature(25)
print(temp.celsius)  # 25
temp.celsius = 30    # 通過描述符修改
# temp.celsius = -300 # 報錯

3. 數(shù)值類型轉(zhuǎn)換

方法調(diào)用時機
__int__int(obj)
__float__float(obj)
__bool__bool(obj)
__complex__complex(obj)
class Percentage:
    def __init__(self, value):
        self.value = value
    
    def __int__(self):
        return int(self.value)
    
    def __float__(self):
        return float(self.value / 100)
    
    def __bool__(self):
        return self.value != 0
    
    def __str__(self):
        return f"{self.value}%"

p = Percentage(75)
print(int(p))      # 75
print(float(p))    # 0.75
print(bool(p))     # True
print(bool(Percentage(0)))  # False

四、魔術(shù)方法最佳實踐

謹(jǐn)慎使用:只在確實需要時實現(xiàn)魔術(shù)方法

保持一致性

  • 實現(xiàn)__eq__時也應(yīng)實現(xiàn)__hash__
  • 實現(xiàn)比較運算符時最好實現(xiàn)全套

性能考慮:魔術(shù)方法會被頻繁調(diào)用,應(yīng)保持高效

文檔說明:明確記錄每個魔術(shù)方法的行為

避免過度使用:不是所有類都需要成為"全能選手"

五、綜合案例:自定義分?jǐn)?shù)類

class Fraction:
    """自定義分?jǐn)?shù)類,演示多種魔術(shù)方法"""
    
    def __init__(self, numerator, denominator=1):
        if denominator == 0:
            raise ValueError("分母不能為零")
        
        # 約分
        common = self.gcd(numerator, denominator)
        self.num = numerator // common
        self.den = denominator // common
    
    @staticmethod
    def gcd(a, b):
        """計算最大公約數(shù)"""
        while b:
            a, b = b, a % b
        return a
    
    def __add__(self, other):
        """重載+運算符"""
        if isinstance(other, int):
            other = Fraction(other)
        new_num = self.num * other.den + other.num * self.den
        new_den = self.den * other.den
        return Fraction(new_num, new_den)
    
    __radd__ = __add__  # 反向加法
    
    def __sub__(self, other):
        """重載-運算符"""
        return self.__add__(-other)
    
    def __neg__(self):
        """重載負(fù)號"""
        return Fraction(-self.num, self.den)
    
    def __mul__(self, other):
        """重載*運算符"""
        if isinstance(other, int):
            other = Fraction(other)
        return Fraction(self.num * other.num, self.den * other.den)
    
    __rmul__ = __mul__  # 反向乘法
    
    def __truediv__(self, other):
        """重載/運算符"""
        if isinstance(other, int):
            other = Fraction(other)
        return Fraction(self.num * other.den, self.den * other.num)
    
    def __eq__(self, other):
        """重載==運算符"""
        if isinstance(other, int):
            other = Fraction(other)
        return self.num == other.num and self.den == other.den
    
    def __lt__(self, other):
        """重載<運算符"""
        return self.num * other.den < other.num * self.den
    
    def __le__(self, other):
        """重載<=運算符"""
        return self.__lt__(other) or self.__eq__(other)
    
    def __str__(self):
        """字符串表示"""
        if self.den == 1:
            return str(self.num)
        return f"{self.num}/{self.den}"
    
    def __repr__(self):
        """解釋器表示"""
        return f"Fraction({self.num}, {self.den})"
    
    def __float__(self):
        """轉(zhuǎn)換為浮點數(shù)"""
        return self.num / self.den

# 使用示例
f1 = Fraction(3, 4)
f2 = Fraction(2, 5)

print(f1 + f2)    # 23/20
print(f1 - f2)    # 7/20
print(f1 * f2)    # 3/10
print(f1 / f2)    # 15/8
print(f1 == Fraction(6, 8))  # True
print(f1 < f2)    # False
print(float(f1))  # 0.75
print(2 + f1)     # 11/4 (調(diào)用__radd__)

通過這個完整的分?jǐn)?shù)類實現(xiàn),我們綜合運用了多種魔術(shù)方法,使自定義類能夠像內(nèi)置類型一樣自然地參與各種運算和操作。

魔術(shù)方法是Python強大而靈活的特性,合理使用它們可以讓你的類更加Pythonic,與Python語言的其他特性無縫集成。記住,能力越大責(zé)任越大,魔術(shù)方法應(yīng)該用來增強代碼的清晰度和可用性,而不是制造"魔法"般的復(fù)雜性。

以上就是從入門到精通的Python魔術(shù)方法(Magic Methods)完全指南的詳細(xì)內(nèi)容,更多關(guān)于Python魔術(shù)方法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python實現(xiàn)自動整理文件的腳本

    Python實現(xiàn)自動整理文件的腳本

    這篇文章主要介紹了Python實現(xiàn)自動整理文件的腳本,幫助大家更好的利用python處理文件,感興趣的朋友可以了解下
    2020-12-12
  • 在Python中,不用while和for循環(huán)遍歷列表的實例

    在Python中,不用while和for循環(huán)遍歷列表的實例

    今天小編就為大家分享一篇在Python中,不用while和for循環(huán)遍歷列表的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • Pytorch之上/下采樣函數(shù)torch.nn.functional.interpolate插值詳解

    Pytorch之上/下采樣函數(shù)torch.nn.functional.interpolate插值詳解

    這篇文章主要介紹了Pytorch之上/下采樣函數(shù)torch.nn.functional.interpolate插值,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Windows平臺Python編程必會模塊之pywin32介紹

    Windows平臺Python編程必會模塊之pywin32介紹

    在Windows平臺上,從原來使用C/C++編寫原生EXE程序,到使用Python編寫一些常用腳本程序,成熟的模塊的使用使得編程效率大大提高了
    2019-10-10
  • python在不同層級目錄import模塊的方法

    python在不同層級目錄import模塊的方法

    這篇文章主要介紹了python 在不同層級目錄import 模塊的方法,需要的朋友可以參考下
    2016-01-01
  • Python?pip更換鏡像源問題及解決

    Python?pip更換鏡像源問題及解決

    文章介紹了Python的pip包管理工具更換鏡像源的方法,包括清華大學(xué)、阿里云、中國科技大學(xué)和豆瓣等常用鏡像源,文章詳細(xì)說明了臨時使用鏡像源和永久配置鏡像源的方法,并附上了針對Conda的鏡像配置示例,最后,作者推薦使用國內(nèi)鏡像源以提高下載速度
    2025-02-02
  • Pandas 如何處理DataFrame中的inf值

    Pandas 如何處理DataFrame中的inf值

    這篇文章主要介紹了Pandas 如何處理DataFrame中的inf值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 使用Python對SQLite數(shù)據(jù)庫操作

    使用Python對SQLite數(shù)據(jù)庫操作

    本文主要介紹了Python對SQLite數(shù)據(jù)庫操作的簡單教程。SQLite是一種嵌入式數(shù)據(jù)庫,它的數(shù)據(jù)庫就是一個文件。由于SQLite本身是C寫的,而且體積很小,所以,經(jīng)常被集成到各種應(yīng)用程序中,甚至在IOS和Android的APP中都可以集成。
    2017-04-04
  • django基于cors解決跨域請求問題詳解

    django基于cors解決跨域請求問題詳解

    這篇文章主要介紹了django基于cors解決跨域請求問題詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • Python pytest 框架通關(guān)指南:自動化測試不再難

    Python pytest 框架通關(guān)指南:自動化測試不再難

    文章介紹了pytest一個高效的Python測試框架,其優(yōu)點包括簡單易用、強大的斷言庫、支持參數(shù)化測試和豐富的插件生態(tài)系統(tǒng),解釋了安裝、用例運行規(guī)則、命令參數(shù)、配置文件、前后置操作、斷言以及參數(shù)化等內(nèi)容,通過示例代碼展示了其用法和優(yōu)勢,感興趣的朋友跟隨小編一起看看吧
    2026-03-03

最新評論

沐川县| 洛南县| 澜沧| 康平县| 大兴区| 灵石县| 双鸭山市| 康定县| 泸西县| 邻水| 炎陵县| 韶关市| 龙里县| 襄樊市| 南部县| 灌阳县| 施秉县| 改则县| 天长市| 穆棱市| 大洼县| 深州市| 如东县| 桃园市| 马龙县| 伊金霍洛旗| 昭苏县| 阿巴嘎旗| 松阳县| 湘乡市| 新乡市| 灵寿县| 巴林右旗| 铜梁县| 武强县| 阿拉善右旗| 台前县| 栾川县| 区。| 赤壁市| 蒙城县|