python在哪里存储类中的继承信息?

时间:2017-03-30 07:40:00

标签: python oop inheritance

python版本3.5.2
我试图从子类中获取父类:

class A:
    pass
class B(A):
    pass
经过一番研究后,我得到了python doc的解决方案:使用__base__。 (特殊的类属性) 但是我在"__base__"B.__dict__中找不到这个dir(B) ,这是我获取属性的正常方法。

这绝对是与课程相关的信息,如果它不在B.__dict__的哪个位置? (虽然我意识到"__base__")返回了type(B).__dict__ 为什么dir()没有归还呢?根据我读到的this stackoverflow questiondir()背后有一些逻辑,它应该返回“所有可用属性的完整图片。”

我最初认为这是故意隐藏......但你仍然可以轻易地操纵孩子的父母:

class C:
    pass
B.__bases__ = (C,) # voila, B got a new Dad

1 个答案:

答案 0 :(得分:1)

参见关于dir()的说明(强调我的):

  

注意:因为dir()主要是为了方便在交互式提示中使用而提供的,所以它试图提供一组有趣的名称,而不是尝试提供严格或一致定义的名称集,以及详细行为可能会在各版本中发生例如,当参数是类时,元类属性不在结果列表中。

B是一个类,其元类是type。因此,如果你真的想要完整的图片,你也应该看作元类“dir()

>>> B.__class__ is type
True
>>> dir(type)
['__abstractmethods__', '__base__', '__bases__', '__basicsize__', '__call__', '__class__',
 '__delattr__', '__dict__', '__dictoffset__', '__dir__', '__doc__', '__eq__', '__flags__',
 '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
 '__init_subclass__', '__instancecheck__', '__itemsize__', '__le__', '__lt__',
 '__module__', '__mro__', '__name__', '__ne__', '__new__', '__prepare__', '__qualname__',
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__',
 '__subclasscheck__', '__subclasses__', '__subclasshook__', '__text_signature__',
 '__weakrefoffset__', 'mro']

您有__base____bases__以及the list you linked中出现的其他内容,例如mro__subclasses__