# 特殊方法
运算符无关特殊方法
| 类别 | 方法 |
| --------------- | ------------------------------------------------------------ |
| 字符串/字节序列 | `__repr__`, `__str__`, `__format__`, `__bytes__` |
| 数值转换 | `__abs__`, `__bool__`, `__complex__`, `__init__`, `__float__`, `__hash__`, `__index__` |
| 集合模拟 | `__len__`, `__getitem__`, `__setitem__`, `__delitem__`, `__contains__` |
| 迭代枚举 | `__iter__`, `__reversed__`, `__next__` |
| 可调用模拟 | `__call__` |
| 上下文管理 | `__enter__`, `__exit__` |
| 实例创建和销毁 | `__new__`, `__init__`, `__del__` |
| 属性管理 | `__getattr__`, `__setattr__`, `__delattr__`, `__dir__` |
| 属性描述符 | `__get__`, `__set__`, `__delete__` |
| 类判断 | `__prepare__`, `__instancecheck__`, `__subclasscheck__` |
运算符相关的特殊方法
| 类别 | 运算符 | 方法 |
| ---------- | --------- | -------------- |
| 一元运算符 | - | `__neg__` |
| | + | `__pos__` |
| | abs() | `__abs__` |
| 比较运算符 | < | `__lt__` |
| | <= | `__le__` |
| | == | `__eq__` |
| | != | `__ne__` |
| | > | `__gt__` |
| | >= | `__ge__` |
| 算数运算符 | + | `__add__` |
| | - | `__sub__` |
| | * | `__mul__` |
| | / | `__truediv__` |
| | // | `__floordiv__` |
| | % | `__mod__` |
| | divmod() | `__divmode__` |
| | **或pow() | `__pow__` |
| | round() | `__round__` |
| | | |
# `__repr__` 和`__str__`
`__repr__` 和`__str__` 能将一个对象用字符串形式表达。当输出一个对象时,默认会调用`repr()` 函数,其调用对象的`__repr__` 方法。`__str__` 方法是在`str()` 函数被使用或者在`print()` 函数打印一个对象。一般不用实现两个特殊方法,如果一个对象没有`__str__` 方法,解释器会使用`__repr__` 方法代替。
```python
from math import hypot
class Vector():
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __repr__(self):
return 'Vector(%r, %r)' % (self.x, self.y)
def __abs__(self):
return hypot(self.x, self.y)
def __bool__(self):
return bool(abs(self))
def __add__(self, other):
x = self.x + other.x
y = self.y + other.y
return Vector(x, y)
def __mul__(self, scalar):
return Vector(self.x*scalar, self.y*scalar)
```
# `__contains__`
在类中添加`__contains__(self, x)` 特殊方法,可以判断输入的x数据是否在对象中,对象具有容器的性质。
```python
class Graph():
def __init__(self):
self.items = {'a': 1, 'b': 2, 'c': 3}
def __contains__(self, x):
return x in self.items
one_ob = Graph()
print('a' in one_ob)
print('d' in one_ob)
>>>True
>>>False
```