• Python--特殊方法


    不管在哪种框架下写程序,都会花费大量时间去实现那些会被框架本身调用的方法。
    Python 解释器碰到特殊的句法时,会使用特殊方法去激活一些基本的对象操作,这些特殊方法的名字以两个下划线开头,以两个下划线结尾
    比如 obj[key] 的背后就是 __getitem__ 方法,为了能求得my_collection[key] 的值,解释器实际上会调用my_collection.__getitem__(key)。
    比如 for i in x: 这个语句,背后其实用的是iter(x),而这个函数的背后则是 x.__iter__() 方法。当然前提是这个方法在 x 中被实现了。
     
    特殊方法的存在是为了被 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)
    这些方法(除了 __init__)并不会在这个类自身的代码中使用。即便其他程序要使用这个类的这些方法,也不会直接调用它们,一般只有 Python 解释器会频繁地直接调用这
    些方法。
     
    __repr__
    如果没有实现 __repr__,当我们在控制台里打印一个向量的实例时,得到的字符串可能会是 <Vector object at 0x10e100070>。
    __repr__ 和 __str__ 的区别在于,后者是在 str() 函数被使用,或是在用 print 函数打印一个对象的时候才被调用的,并且它返回的字符串对终端用户更友好。
    如果你只想实现这两个特殊方法中的一个,__repr__ 是更好的选择,因为如果一个对象没有 __str__ 函数,而 Python 又需要调用它的时候,解释器会用 __repr__ 作为替代。
     
    二、特殊方法一览
    字符串 / 字节序列表示形式
    __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__
     

  • 相关阅读:
    运筹学——线性规划及单纯形法求解
    jQuery实现回到顶部功能
    JS与PHP传递JSON数据
    学习笔记Quartz定时器
    MYSQL常用命令总结
    DWZ框架与第三方jQuery插件整合
    jQuery中增加新元素后没法响应原有的事件
    java.lang.OutOfMemoryError: Java heap space解决方法
    Adobe Edge Animate1.0 使用元件创建嵌套动画
    Adobe Edge Animate 1.0 制作自定义动态菜单
  • 原文地址:https://www.cnblogs.com/absoluteli/p/14089956.html
Copyright © 2020-2023  润新知