在Custom Classes的The Python Language Reference部分,声明:
特殊属性:
__name__
是类名;__module__
是定义类的模块名称;__dict__
是包含类名称空间的字典;__bases__
是一个包含基类的元组(可能为空或单例),按它们在基类列表中出现的顺序排列;__doc__
是类的文档字符串,如果未定义,则为None
。
因此,__bases__
对于自定义类可以"可能为空"?如果所有内容都隐含地继承自Python object
中的3
?
唯一一个空__bases__
的课程本身是object
:
>>> object.__bases__
()
我错过了什么吗?
答案 0 :(得分:2)
自从Python 3发布之前,这条线已经存在。这是2007 commit。当对象模型被修改以摆脱旧式类时,看起来文档中的信息通过审查而滑落,现在可能只是错误的信息。
我建议您提出documentation issue来澄清它是否不正确/过时。
答案 1 :(得分:2)
该段落并非如此误导错误,因为它出现在哪里:“自定义类”是数据模型文档中唯一一个__bases__
被解决的地方。由于使用自定义类是您唯一可能关心__bases__
内容的时间,我想这是有道理的。
令人惊讶的是,它提供了__bases__
的完整描述,包括仅适用于非 - 自定义类(如内置,object
)的详细信息。正如您所指出的,object.__bases__
为空:
>>> object.__bases__
()
我认为该短语应该是unknown_class.__bases__[0]
可以提出IndexError
的提示,因为即使在Python 3中,__bases__
也可以空。
__bases__
也可能是一个单身人士。为什么有人会关心那个那个,我无法想象。也许用“单身人士”,他们的意思是“一元组”?呃,好吧......我还是不在乎。
PS:如果有人试图在创建类之后偷偷地替换更新:作为wim has pointed out,有问题的段落于2007年8月15日星期三与all of Python 2's
Docs/reference/datamodel.rst
一起导入,并且自那时起基本保持不变。然而,它所在的部分只是当时的“类”。该部分于2007年8月31日星期五renamed to "Custom classes",作为消除“旧式”/“新式”区别的努力的一部分。添加“自定义”一词似乎不是一种改进,因为该部分的大部分适用于大多数或所有类(我不知道它适用于从另一种语言编译的类的程度)。
__bases__
属性,那么Python 3会为您提供一条特殊的错误消息......
>>> 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 ()