Skip to content

Python 魔法函数一览

非数学运算类型

字符串表示

  • __repr__
  • __str__

集合序列相关

  • __len__
  • __getitem__
  • __setitem__
  • __delitem__
  • __contains__

迭代相关

  • __iter__
  • __next__

可调用

  • __call__

with 上下文管理器

  • __enter__
  • __exit__

数值转换

  • __abs__
  • __bool__
  • __int__
  • __float__
  • __hash__
  • __index__

元类相关

  • __new__
  • __init__

属性相关

  • __getattr__
  • __setattr__
  • __getattribute__
  • __setattribute__
  • __dir__

属性描述符

  • __get__
  • __set__
  • __delete__

协程

  • __await__
  • __aiter__
  • __anext__
  • __aenter__
  • __aexit__

数学运算类型

一元运算符

  • __neg__(-)
  • __pos__(+)
  • __abs__

二元运算符

  • __lt__(<)
  • __le__ <=
  • __eq__ ==
  • __ne__ !=
  • __gt__ >
  • __ge__ >=

算术运算符

  • __add__ +
  • __sub__ -
  • __mul__ *
  • __truediv__ /
  • __floordiv__ //
  • __mod__ %
  • __divmod__ 或 divmod()
  • __pow__ 或 ** 或 pow()
  • __round__ 或 round()

反向算术运算符

  • __radd__
  • __rsub__
  • __rmul__
  • __rtruediv__
  • __rfloordiv__
  • __rmod__
  • __rdivmod__
  • __rpow__

增量赋值算术运算符

  • __iadd__
  • __isub__
  • __imul__
  • __itruediv__
  • __ifloordiv__
  • __imod__
  • __ipow__

位运算符

  • __invert__ ~
  • __lshift__ <<
  • __rshift__ >>
  • __and__ &
  • __or__ |
  • __xor__ ^

反向位运算符

  • __rlshift__
  • __rrshift__
  • __rand__
  • __rxor__
  • __ror__

增量赋值位运算符

  • __ilshift__
  • __irshift__
  • __iand__
  • __ixor__
  • __ior__

调试工具

  • notebook

首先使用 pip install -i https://douban.com/simple notebook 安装

然后运行 ipython notebook

字符串表示

  • __str__

在打印一个实例化对象的时候, python 默认会调用 str (对象), 对应的魔法函数是 __str__

class Company(object):
    def __init__(self, employee_list):
        self.employee = employee_list

company = Company(["tom", "jerry", "bya"])
print(company)
print(str(company))
#------------------------------------
<__main__.Company object at 0x000001AFBB114B88>
<__main__.Company object at 0x000001AFBB114B88>
  • __repr__

__repr__是在开发模式下调用的

class Company(object):
    def __init__(self, employee_list):
        self.employee = employee_list

company = Company(["tom", "jerry", "bya"])
print(company)
company
#------------------------------------
<__main__.Company object at 0x0000020A9D7672B0>
<__main__.Company at 0x20a9d7672b0>

再次强调, __repr__不是因为该类继承了某一个对象才能去写这个方法, 魔法函数可以写到任何一个定义的类中去, 然后 python 解释器识别出这个对象有该特性。接着,在调试模式下,company 会被解释器转换为 repr(company), 然后再去调用 company.__repr__().

class Company(object):
    def __init__(self, employee_list):
        self.employee = employee_list

    def __str__(self):
        return ','.join(self.employee)

    def __repr__(self):
        return '.'.join(self.employee)

company = Company(["tom", "jerry", "bya"])
print(company) # str  输出
company        # repr 输出

tom,jerry,bya   # 打印对象
tom,jerry,bya   # 调试模式