Python类有大量特殊方法,实现不同的特殊方法后该类对象则会支持对应的运算符或内置函数,下面的对应关系表列出了大部分特殊方法:
| 方法 | 功能说明 |
| __new__() | 类的静态方法,用于确定是否要创建对象 |
| __init__() | 构造方法,创建对象时自动调用 |
| __del__() | 析构方法,释放对象时自动调用 |
| __add__() | + |
| __sub__() | - |
| __mul__() | * |
| __truediv__() | / |
| __floordiv__() | // |
| __mod__() | % |
| __pow__() | ** |
| __eq__()、 __ne__()、 __lt__()、 __le__()、 __gt__()、 __ge__() |
==、 !=、 <、 <=、 >、 >= |
| __lshift__()、__rshift__() | <<、>> |
| __and__()、__or__()、 __invert__()、__xor__() |
&、|、 ~、^ |
| __iadd__()、__isub__() | +=、-=,很多其他运算符也有与之对应的复合赋值运算符 |
| __pos__() | 一元运算符+,正号 |
| __neg__() | 一元运算符-,负号 |
| __contains__ () | 与成员测试运算符in对应 |
| __radd__()、__rsub__ | 反射加法、反射减法,一般与普通加法和减法具有相同的功能,但操作数的位置或顺序相反,很多其他运算符也有与之对应的反射运算符 |
| __abs__() | 与内置函数abs()对应 |
| __bool__() | 与内置函数bool()对应,要求该方法必须返回True或False |
| __bytes__() | 与内置函数bytes()对应 |
| __complex__() | 与内置函数complex()对应,要求该方法必须返回复数 |
| __dir__() | 与内置函数dir()对应 |
| __divmod__() | 与内置函数divmod()对应 |
| __float__() | 与内置函数float()对应,要求该该方法必须返回实数 |
| __hash__() | 与内置函数hash()对应 |
| __int__() | 与内置函数int()对应,要求该方法必须返回整数 |
| __len__() | 与内置函数len()对应 |
| __next__() | 与内置函数next()对应 |
| __reduce__() | 提供对reduce()函数的支持 |
| __reversed__() | 与内置函数reversed()对应 |
| __round__() | 对内置函数round()对应 |
| __str__() | 与内置函数str()对应,要求该方法必须返回str类型的数据 |
| __repr__() | 打印、转换,要求该方法必须返回str类型的数据 |
| __getitem__() | 按照索引获取值 |
| __setitem__() | 按照索引赋值 |
| __delattr__() | 删除对象的指定属性 |
| __getattr__() | 获取对象指定属性的值,对应成员访问运算符“.” |
| __getattribute__() | 获取对象指定属性的值,如果同时定义了该方法与__getattr__(),那么__getattr__()将不会被调用,除非在__getattribute__()中显式调用__getattr__()或者抛出AttributeError异常 |
| __setattr__() | 设置对象指定属性的值 |
| __base__ | 该类的基类 |
| __class__ | 返回对象所属的类 |
| __dict__ | 对象所包含的属性与值的字典 |
| __subclasses__() | 返回该类的所有子类 |
| __call__() | 包含该特殊方法的类的实例可以像函数一样调用 |
| __get__() | 定义了这三个特殊方法中任何一个的类称作描述符(descriptor),描述符对象一般作为其他类的属性来使用,这三个方法分别在获取属性、修改属性值或删除属性时被调用 |
| __set__() | |
| __delete__() |
下面举几个例子演示特殊方法的用法:
# 普通类,对象不支持加法运算
>>> class T:
def __init__(self, v):
self.__value = v
>>> t = T(3)
>>> t + 5
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
t + 5
TypeError: unsupported operand type(s) for +: 'T' and 'int'
# 为类实现特殊方法__add__(),对象支持加法运算
# 不支持直接显示对象,也不支持使用print()进行显示
>>> class T:
def __init__(self, v):
self.__value = v
def __add__(self, v):
return T(self.__value + v)
>>> t = T(3)
>>> t + 5
<__main__.T object at 0x0000028472147470>
# 为类实现特殊方法__repr__()和__str__()
# 对象支持直接显示和使用print()显示
>>> class T:
def __init__(self, v):
self.__value = v
def __add__(self, v):
return T(self.__value + v)
def __repr__(self):
return repr(self.__value)
def __str__(self):
return str(self.__value)
>>> t = T(3)
>>> tt = t + 5
>>> tt
8
>>> print(tt)
8

