• python 的魔术方法


    魔术方法

    在类中定义的魔术方法,只会对该类的实例起作用,不会对类对象起作用。在类的定义的魔术方法大部分都是类的实例才能“触发”。

     

    实例对象

    __new__(cls, *args, **kwargs)

      staticmethod

      作用:根据提供的类,构造一个该类型的实例

      调用:构造实例、实例化对象时候调用

      返回值:返回一个实例对象。

      python 的复杂类型传参使用的是引用地址,在函数中执行会改变原值。关键字传参时先构建字典

     

    __init__(self)

      作用:对实例进行初始化,可以不进行初始化

      调用:__new__函数调用后自动执行,但是和__new__为两个不同的作用域,不同的参数对象。

      返回值:必须为None

     

    __del__(self)

      作用:一般在这个对象销毁之前,将这个对象相关的资源进行释放。

      调用:对象的引用计数为0后,垃圾回收机制对其进行清理前调用。

      返回值:pass

    对象可视化

    __str__(self)

      作用:返回一个很好地向人描述对象的字符串

      调用:直接作为print(), format(), str()函数的参数,当没有这个__str__ 方法会使用__repr__

      返回值:必须为字符串,将直接作为显示输出。

     

    __repr__(self)

      作用:类似于__str__

      如果实现了__repr__而没有定义__str__,那么对象将会表现出__str__ = __repr__反之则不会

     

    __bytes__(self):

      作用:一个对象的bytes表现形式

      调用:bytes()作用时候,调用这个对象的__bytes__方法,返回这个对象的二进制形式

      返回值:返回值必须是二进制的对象类型,将对象encode()

     

    __hash__(self)

    __eq__(self, other)

      作用:作为这个对象的 “ 哈希算法 ”,求哈希时,将会调用该对象的__hash__方法。

      调用:hash()作用于这个对象时,调用这个函数

      返回值:返回一个哈希值范围内的整数

    • 计算哈希值以进程为“作用域”。同一个进程中相同的元素哈希值一定相等,否则一定不同(未产生哈希冲突时)。
    • 哈希表去重:
      • 值相同, 及__eq__返回值相同,未定义eq调用object,使用地址比较。
      • 哈希值相同

    当实现了__eq__(self, other)后,必须实现 __hash__(self)方法这个实例才可以哈希。

    当不可哈希时,将 __hash__ = None , 明确不可哈希,哈希必须返回 interger

     

    __bool__

    __len__

      作用:bool 计算结果

      调用:使用bool函数时。

      返回值:True 或者 False,返回其他值使用等效False判断。

      如果没有返回值,看__len__的长度,为0为false,否则为True。

     

    四则运算符重载

    __sub__(self, other)

    __isub__(self, other)       

      __isub___注意返回值,会覆盖self

      当这个对象未定义 __isub__而进行 -= 计算时候,将计算调用__sub__方法,并将__sub__方法的返回值,赋值给self,这可能造成self被不同类型的数据覆盖。所以重载时注意定义 __i方法__

    运算符重载

    进行大小运算时,可以使用funtools.total_ordering装饰器定义大小比较规则;也可以自定义,必须实现__eq__ ,其他__lt __, __le__, __gt__, __ge__ 方法实现其一即可。

    容器相关

    __len__(self)

      返回长度,正整数。判断bool时,没有bool方法,使用__len__==0 为 false

    __contain__(self, item)

      成员运算符,使用in但是未定义该方法时,使用__iter__迭代计算

    __iter__(self)

      迭代self自身,__iter__一般定义为生成器函数,使用yield返回结果

    __getitem__(self, item):

      键值对取值操作,支持index 和 key-vlaue取值

    __setitem__(self, key, value):

      设置键值对操作。

    __missing__(self, key):

      字典或者其子类使用key取值时,key不存在时调用该方法

    __call__(self,*args, **kwargs)

      在类中定义了该方法,这个类的实例将可被调用。self(*args, **kwargs) => cls .__call__(self, *args, **kwargs),函数将被调用

     

  • 相关阅读:
    数据库主键生成策略
    弹出窗返回数据实体对象或对象集
    我的家乡话,模糊和清晰的记忆......
    曾经年少
    获取父页面URL的参数对应值及左对齐字符串
    .Net编程规范
    DBdifference
    GridView翻页时保持CheckBox选择状态
    .CS中的javascript
    (转)程序员职业规划
  • 原文地址:https://www.cnblogs.com/k5210202/p/13069161.html
Copyright © 2020-2023  润新知