• python双划线类型


    通过__开始的属性感觉分为两种类型:

    利用dir调用的时候:

    < build in x object at 0x01F116B0>:这种貌似和运算符重载有关系,用户如果需要的话可以重写该函数

    <method-wrapper '__eq__' of x object at 0x01F116B0>:这种应该是内部的实现机制,可以直接调用。

    1,__name__

    环境属性,不需要调用者,如果是在顶层文件,那么显示__main__,如果是模块文件,显示当前类名

    2,__class__

    如果是类调用,显示type<class>;如果是实例调用,显示实例对应的类名

    3,__bases__

    类来调用,显示超类名

    4,__init__

    构造函数

    5,__getitem__

    索引、分片时候调用此方法,成员关系测试in,列表解析,内置函数map,列表和元组赋值运算以及类型构造方法也会调用__getitem__(如果定义了的话)

    6,__iter__

    所有的迭代环境都会尝试此方法,再尝试getitem

    迭代环境是通过内置函数iter去尝试寻找__iter__方法来实现,这种方法应该实现一个迭代器对象,如果提供了该方法,python就会重复调用该迭代器的next方法,直到发生StopIteration异常。如果没有定义该方法,python会改用getitem机制,知道引发IndexError异常

    如果用户自定义的迭代器,由自己来决定支持一个、单个或是多个活跃的迭代,如果要达到多个迭代器的效果,__iter__只需要替迭代器定义新的状态对象,而不是返回self

    7,__contains__

    重写该方法用来判断成员关系,此时,该方法由于__iter__方法,__iter方法优于__getitem__方法

    8,__getattr__和__setattr__

    __getattr__拦截属性点号运算

    __setattr__拦截属性赋值语句,如果定义了该方法

    那么self.attr=value就会变成self.__setattr__('attr',value);

    9,__str__和__repr__

    打印操作会首先尝试__str__,它通常应当返回一个用户友好的显示

    __repr__用于所有其他环境,相比较而言它更底层

    二者都必须返回字符串,__str__只对于打印操作顶层的时候才试用,如果嵌套到较大的对象,那么应当使用__repr__(p728)

    10,__call__

    当实例调用方法的时候,运行__call__方法,这在编写api接口的时候,很有用,大概是出了__init__,__str__,__repr__之外,最常用的运算符重载方法了(关于这个有点晕)

    11, 比较运算符:__gt__,__lt__

    12,bool判断:__bool__,__len__

    判断实例布尔特性的方法:__bool__,如果没有这个方法,python会退而求其次,判断__len__。因为将一个非空对象看作为真

    13,析构函数__del__

    不过因为python具有自己的垃圾回收机制,析构函数一般很少使用

    对于运算符重载的那些,每一种方法和一种特定的方法调用具有映射关系,通过“拦截”内置的操作,实现运算符重载功能

  • 相关阅读:
    linux常用指令
    linux上部署应用
    ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2 JDWP exit error AGENT_ERROR_NO_JNI_ENV(183):
    支持复制粘贴word图片的xhEditor编辑器
    支持复制粘贴word图片的CuteEditor编辑器
    支持复制粘贴word图片的TinyMCE编辑器
    支持复制粘贴word图片的eWebEditor编辑器
    支持复制粘贴word图片的wangEditor编辑器
    支持复制粘贴word图片的KindEditor编辑器
    支持复制粘贴word图片的CKEditor编辑器
  • 原文地址:https://www.cnblogs.com/bobodeboke/p/3337387.html
Copyright © 2020-2023  润新知