具有空__bases__属性的自定义类

时间:2016-11-19 19:31:06

标签: python class python-3.x

Custom ClassesThe Python Language Reference部分,声明:

  

特殊属性:__name__是类名; __module__是定义类的模块名称; __dict__是包含类名称空间的字典; __bases__是一个包含基类的元组(可能为空或单例),按它们在基类列表中出现的顺序排列; __doc__是类的文档字符串,如果未定义,则为None

因此,__bases__对于自定义类可以"可能为空"?如果所有内容都隐含地继承自Python object中的3

,那怎么能实现呢?

唯一一个空__bases__的课程本身是object

>>> object.__bases__
()

我错过了什么吗?

2 个答案:

答案 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__也可能是一个单身人士。为什么有人会关心那个那个,我无法想象。也许用“单身人士”,他们的意思是“一元组”?呃,好吧......我还是不在乎。

  

更新:作为wim has pointed out,有问题的段落于2007年8月15日星期三与all of Python 2's Docs/reference/datamodel.rst一起导入,并且自那时起基本保持不变。然而,它所在的部分只是当时的“类”。该部分于2007年8月31日星期五renamed to "Custom classes",作为消除“旧式”/“新式”区别的努力的一部分。

     

添加“自定义”一词似乎不是一种改进,因为该部分的大部分适用于大多数或所有类(我不知道它适用于从另一种语言编译的类的程度)。

PS:如果有人试图在创建类之后偷偷地替换__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 ()