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 question,dir()
背后有一些逻辑,它应该返回“所有可用属性的完整图片。”
我最初认为这是故意隐藏......但你仍然可以轻易地操纵孩子的父母:
class C:
pass
B.__bases__ = (C,) # voila, B got a new Dad
答案 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__
。