Python魔法方法

===============================基本的魔法方法==============================


__new__(cls[, ...])                      1. __new__ 是在一个对象实例化的时候所调用的第一个方法
                                         2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __init__ 方法
                                         3. __new__ 决定是否要使用该 __init__ 方法,因为 __new__ 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 __new__ 没有返回实例对象,则 __init__ 不会被调用
                                         4. __new__ 主要是用于继承一个不可变的类型比如一个 tuple 或者 string 
__init__(self[, ...])                    构造器,当一个实例被创建的时候调用的初始化方法 
__del__(self)                            析构器,当一个实例被销毁的时候调用的方法 
__call__(self[, args...])                允许一个类的实例像函数一样被调用:x(a, b) 调用 x.__call__(a, b) 
__len__(self)                            定义当被 len() 调用时的行为 
__repr__(self)                           定义当被 repr() 调用时的行为 
__str__(self)                            定义当被 str() 调用时的行为 
__bytes__(self)                          定义当被 bytes() 调用时的行为 
__hash__(self)                           定义当被 hash() 调用时的行为 
__bool__(self)                           定义当被 bool() 调用时的行为,应该返回 True 或 False 
__format__(self, format_spec)            定义当被 format() 调用时的行为 
 
=============================================有关属性============================================= 


__getattr__(self, name)                  定义当用户试图获取一个不存在的属性时的行为 
__getattribute__(self, name)             定义当该类的属性被访问时的行为 
__setattr__(self, name, value)           定义当一个属性被设置时的行为 
__delattr__(self, name)                  定义当一个属性被删除时的行为 
__dir__(self)                            定义当 dir() 被调用时的行为 
__get__(self, instance, owner)           定义当描述符的值被取得时的行为 
__set__(self, instance, value)           定义当描述符的值被改变时的行为 
__delete__(self, instance)               定义当描述符的值被删除时的行为 
 
======================比较操作符=================================== 


__lt__(self, other)                      定义小于号的行为:x < y 调用 x.__lt__(y) 
__le__(self, other)                      定义小于等于号的行为:x <= y 调用 x.__le__(y) 
__eq__(self, other)                      定义等于号的行为:x == y 调用 x.__eq__(y) 
__ne__(self, other)                      定义不等号的行为:x != y 调用 x.__ne__(y) 
__gt__(self, other)                      定义大于号的行为:x > y 调用 x.__gt__(y) 
__ge__(self, other)                      定义大于等于号的行为:x >= y 调用 x.__ge__(y) 
 
=======================算数运算符==================================== 


__add__(self, other)                     定义加法的行为:+ 
__sub__(self, other)                     定义减法的行为:-  
__mul__(self, other)                     定义乘法的行为:* 
__truediv__(self, other)                 定义真除法的行为:/ 
__floordiv__(self, other)                定义整数除法的行为:// 
__mod__(self, other)                     定义取模算法的行为:% 
__divmod__(self, other)                  定义当被 divmod() 调用时的行为 
__pow__(self, other[, modulo])           定义当被 power() 调用或 ** 运算时的行为 
__lshift__(self, other)                  定义按位左移位的行为:<< 
__rshift__(self, other)                  定义按位右移位的行为:>> 
__and__(self, other)                     定义按位与操作的行为:& 
__xor__(self, other)                     定义按位异或操作的行为:^ 
__or__(self, other)                      定义按位或操作的行为:|  
 
====================反运算============================================= 


__radd__(self, other)                   (与上方相同,当左操作数不支持相应的操作时被调用) 
__rsub__(self, other)                   (与上方相同,当左操作数不支持相应的操作时被调用) 
__rmul__(self, other)                   (与上方相同,当左操作数不支持相应的操作时被调用) 
__rtruediv__(self, other)               (与上方相同,当左操作数不支持相应的操作时被调用) 
__rfloordiv__(self, other)              (与上方相同,当左操作数不支持相应的操作时被调用) 
__rmod__(self, other)                   (与上方相同,当左操作数不支持相应的操作时被调用) 
__rdivmod__(self, other)                (与上方相同,当左操作数不支持相应的操作时被调用) 
__rpow__(self, other)                   (与上方相同,当左操作数不支持相应的操作时被调用) 
__rlshift__(self, other)                (与上方相同,当左操作数不支持相应的操作时被调用) 
__rrshift__(self, other)                (与上方相同,当左操作数不支持相应的操作时被调用) 
__rand__(self, other)                   (与上方相同,当左操作数不支持相应的操作时被调用) 
__rxor__(self, other)                   (与上方相同,当左操作数不支持相应的操作时被调用) 
__ror__(self, other)                    (与上方相同,当左操作数不支持相应的操作时被调用) 
 
====================增量赋值运算======================================== 


__iadd__(self, other)                    定义赋值加法的行为:+= 
__isub__(self, other)                    定义赋值减法的行为:-= 
__imul__(self, other)                    定义赋值乘法的行为:*= 
__itruediv__(self, other)                定义赋值真除法的行为:/= 
__ifloordiv__(self, other)               定义赋值整数除法的行为://= 
__imod__(self, other)                    定义赋值取模算法的行为:%= 
__ipow__(self, other[, modulo])          定义赋值幂运算的行为:**= 
__ilshift__(self, other)                 定义赋值按位左移位的行为:<<= 
__irshift__(self, other)                 定义赋值按位右移位的行为:>>= 
__iand__(self, other)                    定义赋值按位与操作的行为:&= 
__ixor__(self, other)                    定义赋值按位异或操作的行为:^= 
__ior__(self, other)                     定义赋值按位或操作的行为:|= 
 
====================一元操作符============================================= 


__pos__(self)                            定义正号的行为:+x 
__neg__(self)                            定义负号的行为:-x 
__abs__(self)                            定义当被 abs() 调用时的行为 
__invert__(self)                         定义按位求反的行为:~x 
 
=========================类型转换=============================================


__complex__(self)                        定义当被 complex() 调用时的行为(需要返回恰当的值) 
__int__(self)                            定义当被 int() 调用时的行为(需要返回恰当的值) 
__float__(self)                          定义当被 float() 调用时的行为(需要返回恰当的值) 
__round__(self[, n])                     定义当被 round() 调用时的行为(需要返回恰当的值) 
__index__(self)                          1. 当对象是被应用在切片表达式中时,实现整形强制转换
                                         2. 如果你定义了一个可能在切片时用到的定制的数值型,你应该定义 __index__
                                         3. 如果 __index__ 被定义,则 __int__ 也需要被定义,且返回相同的值 
 
==============上下文管理(with 语句)============================================= 


__enter__(self)                                       1. 定义当使用 with 语句时的初始化行为
                                                      2. __enter__ 的返回值被 with 语句的目标或者 as 后的名字绑定 
__exit__(self, exc_type, exc_value, traceback)        1. 定义当一个代码块被执行或者终止后上下文管理器应该做什么
                                                      2. 一般被用来处理异常,清除工作或者做一些代码块执行完毕之后的日常工作 
 
====================容器类型============================================= 


__len__(self)                                          定义当被 len() 调用时的行为(返回容器中元素的个数) 
__getitem__(self, key)                                 定义获取容器中指定元素的行为,相当于 self[key] 
__setitem__(self, key, value)                          定义设置容器中指定元素的行为,相当于 self[key] = value 
__delitem__(self, key)                                 定义删除容器中指定元素的行为,相当于 del self[key] 
__iter__(self)                                         定义当迭代容器中的元素的行为 
__reversed__(self)                                     定义当被 reversed() 调用时的行为 
__contains__(self, item)                               定义当使用成员测试运算符(in 或 not in)时的行为 
### Python 魔法方法的定义与使用 #### 什么是魔法方法? 在 Python 中,魔法方法是指那些前后带有双下划线的方法(即 `__method_name__`)。这些特殊命名的方法允许开发者自定义类的行为,并提供了一种机制来实现对象之间的操作符重载和其他内置功能。通过实现特定的魔法方法,可以改变 Python 默认行为以满足需求。 #### 常见的魔法方法及其作用 以下是几个常见的魔法方法及其具体用途: 1. **比较运算符重载** 可以通过实现一系列魔法方法来自定义对象间的比较逻辑。例如: - `__eq__(self, other)` 定义等于 (`==`) 的行为。 - `__ne__(self, other)` 定义不等于 (`!=`) 的行为。 - `__lt__(self, other)` 定义小于 (`<`) 的行为。 - `__le__(self, other)` 定义小于等于 (`<=`) 的行为。 - `__gt__(self, other)` 定义大于 (`>`) 的行为。 - `__ge__(self, other)` 定义大于等于 (`>=`) 的行为[^1]。 2. **属性访问控制** 使用 `__getattribute__` 方法可以深度控制对象属性的访问方式。此方法会在每次尝试获取对象属性时触发,相较于 `__getattr__` 更加灵活和强大[^3]。 3. **使对象可调用** 实现 `__call__` 方法可以让一个类的实例像函数一样被调用。这使得对象能够模拟函数的行为,从而增强代码的灵活性[^4]。 #### 示例代码展示 下面是一个综合示例,展示了如何利用上述几种魔法方法的功能: ```python class MyClass: def __init__(self, value): self.value = value # 自定义相等判断 def __eq__(self, other): if isinstance(other, MyClass): return self.value == other.value return False # 控制属性访问 def __getattribute__(self, name): attr = super().__getattribute__(name) if name == 'value': print(f"Accessing attribute '{name}' with value {attr}") return attr # 让对象支持调用 def __call__(self, *args): return sum(args) # 测试 obj1 = MyClass(10) obj2 = MyClass(10) print(obj1 == obj2) # 输出 True print(obj1.value) # 输出 Accessing attribute 'value' with value 10 并返回 10 print(obj1(1, 2, 3)) # 输出 6 ``` #### 协同程序的支持 除了以上提到的内容外,某些魔法方法还参与实现了更高级别的特性,比如协同程序(coroutine)。通过定义诸如 `__await__`, `__aiter__`, 和 `__anext__` 这样的方法,可以使对象具备异步迭代的能力[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值