# 特殊方法 运算符无关特殊方法 | 类别 | 方法 | | --------------- | ------------------------------------------------------------ | | 字符串/字节序列 | `__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 ```