Python Special Methods - 特殊方法




特殊方法

特殊方法的存在是为了给 Python 解释器调用的,通常自己并不需要直接调用它们。
也就是说不应该使用 my_object.__len__() 这种写法,而应该使用 len(my_object)调用。
在执行 len(my_object) 的时候,如果 my_object 是一个自定义类的对象,那么 Python 解释器会
去调用所属类其中的 __len__ 方法。

然而,如果my_object是 Python 内置的类型,如list、str、bytearray 等,
那么 Python 解释器 CPython 会抄个近路,__len__ 方法实际上会直接返回 PyVarObject 里的 ob_size 属性。
PyVarObject 是表示内存中长度可变的内置对象的 C 语言结构体。直接读取这个值比调用一个方法要快很多。
通常特殊方法的调用是隐式的,比如 for i in x: 这个语句,背后其实调用的是 iter(x) 函数,
而这个函数的背后则是 x.__iter__() 方法。当然前提是这个方法在 x 中被实现了。

通常代码无需直接使用特殊方法。一个例外是 __init__ 方法,当代码里需要在子类中 __init__ 方法中调用超类的构造器(__init__),
如, super(BaseCls, self).__init__(args)。

通过内置的函数(例如 len、 iter、 str,等等)来使用特殊方法是最好的选择。这些内置函数不仅会调用特殊方法,通常它们的速度更快。


特殊方法一览表
类别 方法名
字符串 / 字节序列表示形式 __repr__、 __str__、 __format__、 __bytes__
数值转换 __abs__、 __bool__、 __complex__、 __int__、 __float__、 __hash__、 __index__
集合模拟 __len__、 __getitem__、 __setitem__、 __delitem__、 __contains__
迭代枚举 __iter__、 __reversed__、 __next__
可调用__call__
上下文管理 __enter__、 __exit__
创建和销毁实例__new__、 __init__、 __del__
属性管理 __getattr__、 __getattribute__、 __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__ 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__


 

 

转载于:https://www.cnblogs.com/zzyzz/p/7486282.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值