欢迎光临殡葬网
详情描述

Python中以双下划线开头的方法和属性(如 __init__)称为特殊方法魔法方法(magic methods),它们的命名和使用遵循严格的约定。以下是详细分类和具体用法:

一、核心用途分类

1. 对象生命周期控制

class MyClass:
    def __init__(self, value):      # 构造器
        self.value = value

    def __del__(self):              # 析构器(谨慎使用)
        print("对象被销毁")

obj = MyClass(10)  # 触发 __init__
del obj           # 触发 __del__

2. 运算符重载

class Vector:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __add__(self, other):        # 重载 + 运算符
        return Vector(self.x + other.x, self.y + other.y)

    def __str__(self):              # 重载 print()
        return f"Vector({self.x}, {self.y})"

v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2)  # Vector(4, 6)

3. 容器类型模拟

class Stack:
    def __init__(self):
        self._items = []

    def __len__(self):              # 重载 len()
        return len(self._items)

    def __getitem__(self, index):   # 重载 []
        return self._items[index]

    def __setitem__(self, index, value):  # 支持 s[0]=x
        self._items[index] = value

s = Stack()
s._items = [1, 2, 3]
print(len(s))    # 3
print(s[1])      # 2

4. 属性访问控制

class Secret:
    def __init__(self):
        self.public = "公开"
        self._protected = "受保护"
        self.__private = "私有"      # 名称修饰(name mangling)

    def __getattr__(self, name):    # 访问不存在的属性时触发
        return f"{name} 不存在"

s = Secret()
print(s.public)           # "公开"
print(s._protected)       # "受保护"
print(s._Secret__private) # "私有"(实际被重命名为 _Secret__private)
print(s.abc)              # "abc 不存在"(触发 __getattr__)

二、常见魔法方法速查表

分类 方法 触发场景
构造/析构 __new__ 创建实例时第一个调用
__init__ 对象初始化
__del__ 对象销毁
字符串表示 __str__ print(obj)str(obj)
__repr__ repr(obj)、交互式显示
运算符 __add__/__sub__ +/- 运算
__eq__/__lt__ ==/< 比较
容器操作 __len__ len(obj)
__getitem__ obj[key]
__iter__ for x in obj
属性管理 __getattr__ 访问不存在的属性
__setattr__ 设置属性时
__getattribute__ 所有属性访问时
上下文管理 __enter__/__exit__ with 语句

三、重要细节

1. 名称修饰(Name Mangling)

class Test:
    def __init__(self):
        self.__secret = 10     # 实际变为 _Test__secret

t = Test()
print(t._Test__secret)  # 可以访问
print(t.__secret)       # AttributeError

2. 避免无限递归

class Demo:
    def __init__(self):
        self.__dict__['x'] = 1  # 绕过 __setattr__

    def __setattr__(self, name, value):
        # 错误:self.name = value 会再次调用 __setattr__ 导致递归
        # 正确:
        self.__dict__[name] = value

3. 上下文管理器示例

class FileManager:
    def __init__(self, filename):
        self.filename = filename

    def __enter__(self):
        self.file = open(self.filename, 'w')
        return self.file

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()

with FileManager("test.txt") as f:
    f.write("Hello")

四、使用建议

不要随意创建自定义双下划线方法,除非需要特殊行为 优先使用公开接口,私有属性用单下划线 _var 魔法方法不是设计模式替代品,避免过度使用 阅读内置类型源码(如 collections.abc)学习标准实现

五、示例:完整类设计

class Rational:
    """有理数类示例"""
    def __init__(self, numerator, denominator=1):
        self.n = numerator
        self.d = denominator

    def __add__(self, other):
        # 简化版加法
        return Rational(self.n + other.n, self.d)

    def __str__(self):
        return f"{self.n}/{self.d}"

    def __repr__(self):
        return f"Rational({self.n}, {self.d})"

    def __float__(self):
        return self.n / self.d

r1 = Rational(1, 2)
r2 = Rational(3, 2)
print(r1 + r2)    # 4/2
print(float(r1))  # 0.5

记住:双下划线方法让Python对象能够集成到语言基础设施中,正确使用它们可以创建出行为类似内置类型的优雅对象。

相关帖子
在尝试轻断食期间,如何确保营养均衡,避免身体出现不适或营养缺乏?
在尝试轻断食期间,如何确保营养均衡,避免身体出现不适或营养缺乏?
南通市殡葬热线|丧葬一条龙服务办理,丧葬告别会
南通市殡葬热线|丧葬一条龙服务办理,丧葬告别会
南通市正规殡葬服务-冰棺出租,收费合理,快速上门
南通市正规殡葬服务-冰棺出租,收费合理,快速上门
人脸识别技术并非识别你的“脸”,那它真正识别和比对的到底是什么特征?
人脸识别技术并非识别你的“脸”,那它真正识别和比对的到底是什么特征?
孩子/老人甲流症状更隐蔽?这些异常表现家长/子女要盯紧
孩子/老人甲流症状更隐蔽?这些异常表现家长/子女要盯紧
随州市殡葬服务租车|办理丧事,白事录像
随州市殡葬服务租车|办理丧事,白事录像
反季节购买家电和电子产品,需要注意哪些潜在的消费风险与问题?
反季节购买家电和电子产品,需要注意哪些潜在的消费风险与问题?
2026年个税汇算清缴,新增了哪些可以税前扣除的项目?
2026年个税汇算清缴,新增了哪些可以税前扣除的项目?
拉萨市丧事服务-入殓化妆,安全快捷
拉萨市丧事服务-入殓化妆,安全快捷
2026年常见误区澄清:外嫁女不能继承的是宅基地本身还是使用权?
2026年常见误区澄清:外嫁女不能继承的是宅基地本身还是使用权?
个人养老金账户与基本养老保险、企业年金在税收优惠上有何不同之处?
个人养老金账户与基本养老保险、企业年金在税收优惠上有何不同之处?
安庆市殡葬一条龙-丧礼录像,24小时服务热线
安庆市殡葬一条龙-丧礼录像,24小时服务热线
太原市殡葬服务公司一站式办理-白事追悼会策划,24小时服务热线
太原市殡葬服务公司一站式办理-白事追悼会策划,24小时服务热线
在人工智能普及的背景下,专业技术人才如何保持自身不可替代性?
在人工智能普及的背景下,专业技术人才如何保持自身不可替代性?
2026年,远程医疗与线上健康管理服务能否帮助降低部分医疗开支?
2026年,远程医疗与线上健康管理服务能否帮助降低部分医疗开支?
竞业限制协议中约定的违约金数额,法律上是否存在一个合理的上限标准?
竞业限制协议中约定的违约金数额,法律上是否存在一个合理的上限标准?
常德市殡葬服务|白事丧事一条龙,冰棺出租服务
常德市殡葬服务|白事丧事一条龙,冰棺出租服务
在等待救护车时,对晕倒者进行哪些观察可以为医护人员提供关键信息?
在等待救护车时,对晕倒者进行哪些观察可以为医护人员提供关键信息?
合肥市殡葬服务热线-丧葬摄像,全城服务
合肥市殡葬服务热线-丧葬摄像,全城服务
海西殡葬服务公司|白事一条龙办理,白事布置
海西殡葬服务公司|白事一条龙办理,白事布置