• Python: 内置私有方法


    ################## __new__ ##################
    @staticmethod
    __new__(cls [, ...])
    类的构造器,创建某个类的实例,返回值应该是cls 的实例。 它执行在 cls的 __init__ 之前。
    如果__new__不返回cls一个实例,将不会再执行 cls 的 __init__


    ################## __init__ ##################
    __init___(self [, ...])
    类的构造器


    ################## __del__ ##################
    __init___(self [, ...])
    类的析构函数,当使用del obj 时,或者GC时,会调用该析构函数

    ################## __repr__ ##################
    __repr___(self [, ...])
    返回一个字符串,当调用内置函数 repr(obj)时,会调用obj.__repr__

    ################## __str__ ##################
    __repr___(self [, ...])
    返回一个字符串,类似于java中的toString()。当调用内置函数 str(obj)或者print(obj)时,会调用obj.__str__

    ################## 比较操作符 (>,<,>=,<=,!=,==)##################
    两个对象使用 比较运算符(>,<,>=,<=,!=,==)比较时,执行过程是这样的。
    1)优先使用 "rich comparison",即:
    __lt__(self, other),
    __le__(self, other),
    __eq__(self, other),
    __ne__(self, other),
    __gt__(self, other),
    __ge__(self, other),

    2)如果未找到对应的 "rich comparison",则使用 __cmp__:
    __cmp__(self, other)
    在使用__cmp__时, 如果 self < other ,返回负整数,如果 self == other 返回 0,如果 self > other 返回正整数

    3)如果__cmp__也没有找到,则使用object identity (“address”) 进行比较。


    ################## __hash__ ##################
    __hash__(self)
    当使用内置函数 hash(object)时,或者在一个 基于hash的集合上(如 set, frozenset, dict)操作时会调用object.__hash__
    该函数返回一个整数。
    1)如果一个class没有定义 __cmp__或者__eq__,就不应该去定义 __hash__,
    2)如果定义了__cmp__或者__eq__,但是没有定义__hash__,那么该类的实例就不能用在基于hash的集合中,仍然可以用于线性集合中。

    ################## 真值判断(bool(obj)) ##################
    当需要进行真值测试(如使用内置函数 bool(obj)),或者在if 表达式中时,调用流程是这样的:
    1)使用__nonzero__来判断真值:
    __nonzero__(self)
    当需要进行真值测试(如使用内置函数 bool(obj))时,会调用它。返回值是True | False,或者 0 | 1

    2)如果没有定义__nonzero__,则会使用__len__:
    __len__(self)
    该函数,还会在使用内置函数 len(obj)时调用。
    如果是 bool(obj)引起了__len__的调用,则根据__len__的返回值是否为0来判断真值


    ################## __unicode__ ##################
    __unicode__(self)
    返回一个 Unicode对象,会在使用 内置函数 unicode(obj)时调用。如果未定义该函数,则会采用系统默认的编码转换为字符串。
    然后再转为Unicode。

    ################## 像容器一样操作对象 ##################
    __len__(self)
    当使用内置函数len(),bool()会调用它。

    __getitem__(self, key)
    __setitem__(self, key)
    __delitem__(self, key)
    当使用 object[key]时会调用__getitem__,当使用object[key]=value时,会调用__setitem__

    __iter__(self):
    该方法可以在for ... in ... 或者 if in 或者 if not in中调用,
    该函数应该返回一个 iterator对象(一个有__next__(self)的对象)

    __reversed__(self):
    当使用内置函数 reversed()时,会调用该函数。作用是反向迭代。
    该函数应该返回一个反向的iterator对象

    ############### if in 或者 if not in ##################
    在使用 if in 或者 if not in操作时,执行顺序是:
    1)使用__contains__来判断
    __contains__(self, item):
    返回True如果对象中包含item
    2)如果对象中没有定义__contains__,则作为一个通过迭代的的方式来判断
    使用__iter__(self) 返回一个iterator,
    然后使用__next__迭代,迭代过程中使用 item==other 方式来判断
    3)如果上述两种都没有,则通过__getitem__方式判断


    ###############比较对象ID( is 或者 is not) #############
    is 比较对象 ID,== 比较对象值
    可以将 Python 中 is 理解为与Java中的==,Python中 ==理解为java中的equals

    ############### for in 遍历 #########################
    1)使用 __iter__ 返回一个iterator对象,然后调用其 __next__
    2)如果未指定__iter__,但是有 __getitem__(self),则结合 object.__len__ 属性和 object.__getitem__(self)来遍历

  • 相关阅读:
    Spring Boot
    AWS DynamoDB
    VBA读excel写xml
    WebSocket API 学习
    故障排除 Mybatis ORA-01000 和 本地缓存问题
    Java基础
    Java Tutorials Lambda表达式 翻译
    在代理环境中构建maven环境
    Pom
    我的JAVA笔记
  • 原文地址:https://www.cnblogs.com/twodog/p/12136795.html
Copyright © 2020-2023  润新知