【问题标题】:Where are methods of `__del__`, `__bytes__`,`__bool__` defined for class 'object'为类“对象”定义的“__del__”、“__bytes__”、“__bool__”的方法在哪里?
【发布时间】:2018-05-04 11:35:23
【问题描述】:

我正在逐字阅读python官方文档。

在 3.3.特殊方法名3.3.1. Basic customization

object基本自定义下确实指定了16个特殊方法,我收集如下:

In [47]: bc =['__new__', '__init__', '__del__', '__repr__', '__str__', '__bytes__', 
'__format__', '__eq__', '__le__', '__lt__', '__eq__', 
'__ne__', '__ge__', '__gt__', '__hash__', '__bool__']
In [48]: len(bc)
Out[48]: 16

问题是其中三个不是object的有效属性

In [50]: for attr in bc:
    ...:     if hasattr(object,attr):
    ...:         pass
    ...:     else:
    ...:         print(attr)
    ...:
__del__
__bytes__
__bool__

对象是所有类的基础。 2. Built-in Functions — Python 3.6.3 documentation

它没有递归基类。

为类'object'定义的__del____bytes____bool__的方法在哪里?

【问题讨论】:

    标签: python python-3.x class object methods


    【解决方案1】:

    __del__ 绝对不能存在于 object - 它在类中的存在改变了垃圾收集器处理其实例的方式,因此在 object 上使用此方法将使任何类都不可能没有它。

    __bool__ 仅在您想要覆盖在布尔上下文中将对象视为真实的默认行为时才需要。 object 不需要覆盖该行为。

    我不确定__bytes__ 是怎么回事,如果不存在(或类似的东西),我认为它默认为__str__

    【讨论】:

      【解决方案2】:

      __del____bytes____bool__ 的方法在哪里为类 'object' 定义?

      它们没有在object 上定义。这些是您可以在类上自己实现的特殊方法。

      误解可能是因为文档说object.__bool__,但那里的object. 只是意味着它是对象上的一个方法(在“实例”的意义上)如果实现。 同样,该文档页面列表中的后续示例还显示了带有class.__subclasscheck__ 的元类的特殊方法。这并不意味着它总是被实现,更像是如果实现了它就可以在类中使用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-19
        • 1970-01-01
        • 1970-01-01
        • 2014-12-30
        • 1970-01-01
        • 2013-12-18
        相关资源
        最近更新 更多