在关于自定义类 of https://docs.python.org/3/reference/的一节中指出:
特殊属性:
__name__是类名;__module__是定义类的模块名;__dict__是包含类名称空间的字典;__bases__是包含基类的元组(可能为空类或单例),按基类列表中它们出现的顺序排列;__doc__是类的文档字符串,如果未定义,则为None。
那么,定制类的__bases__可以“可能是空的”吗?如果所有东西都隐式地继承了Python中的object,那么如何实现这一点呢?
唯一具有空__bases__的类是object本身:
>>> object.__bases__
()我是不是遗漏了什么?
发布于 2016-11-23 03:32:22
在Python 3发布之前,这一行就已经存在了。这是2007年的提交。当对象模型被修改以摆脱旧风格的类时,看起来文档中的信息似乎通过了评审,现在很可能只是错误的信息。
我可以建议你提出一个文件问题,以澄清它是否不正确/过时。
发布于 2016-11-23 03:38:12
这一段与其说是错误的,不如说是误导性的,因为“自定义类”是数据模型文档中处理__bases__的唯一地方。由于使用自定义类是您唯一可能关心__bases__内容的时候,我想这是有意义的。
令人惊讶的是,它给出了__bases__的完整描述,包括仅适用于非自定义类的细节,比如内置的object。正如您所指出的,object.__bases__是空的:
>>> object.__bases__
()我认为这个短语应该是unknown_class.__bases__[0]可以提出IndexError的提醒,因为即使在Python3中,__bases__也可能是空的。
显然,__bases__也可以是单身人士。为什么有人会在乎这个,我无法想象。也许他们所说的“单身”是指“一元组”?呃,好吧..。我还是不在乎。
更新: As 韦姆指出,该段落是在2007年8月15日随
Docs/reference/datamodel.rst一起导入的,自那以后基本保持不变。然而,它所在的部分只是当时的“类”。这一部分是重命名为“自定义类”在2007年8月31日星期五,作为努力消除“旧风格”/“新风格”区别的一部分。 添加“定制”一词似乎并不是一种改进,因为该部分的大部分内容适用于大多数或所有类(我不知道它在多大程度上适用于从另一种语言编译的类)。
PS:如果有人想在类创建后偷偷地替换__bases__属性,Python3只会为您提供一条特殊的错误消息.
>>> class A: pass
...
>>> A.__bases__
(<class 'object'>,)
>>> A.__bases__ = ()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only assign non-empty tuple to A.__bases__, not ()https://stackoverflow.com/questions/40697047
复制相似问题