在运行时递归遍历Python继承树

Pau*_*han 8 python reflection introspection

我正在Python中编写一些序列化/反序列化代码,它将从某些JSON读取/写入继承层次结构.在发送请求之前,不会知道确切的组成.

所以,我认为在优雅的解决方案,以递归内省Python类层次结构来发射,然后在回来的路上了通过树,在Python基本类型安装正确的价值观.

E.g.,

A
|
|\
| \
B  C
Run Code Online (Sandbox Code Playgroud)

如果我把我的"内省"常规上B,它应该返回一个包含所有A的变量,他们的价值观,以及B的变量和它们的值的映射的字典.

现在看来,我可以查看B.__slots__或者B.__dict__,但我只能从那里提取B的变量名称.

我如何获得__slots__/ __dict__A的,因为仅有B?(或C).

我知道python并不像C++那样直接支持转换及其后代 -

Ad *_*Hoc 12

您可以尝试使用type.mro()方法来查找方法解析顺序.

class A(object):
        pass

class B(A):
        pass

class C(A):
        pass

a = A()
b = B()
c = C()

>>> type.mro(type(b))
[<class '__main__.B'>, <class '__main__.A'>, <type 'object'>]
>>> type.mro(type(c))
[<class '__main__.C'>, <class '__main__.A'>, <type 'object'>]
Run Code Online (Sandbox Code Playgroud)

要么

>>> type(b).mro()
Run Code Online (Sandbox Code Playgroud)

编辑:我以为你想做这样的事......

>>> A = type("A", (object,), {'a':'A var'})  # create class A
>>> B = type("B", (A,), {'b':'B var'})       # create class B
>>> myvar = B()

def getvars(obj):
    ''' return dict where key/value is attribute-name/class-name '''
    retval = dict()
    for i in type(obj).mro():
        for k in i.__dict__:
            if not k.startswith('_'):
                retval[k] = i.__name__
    return retval

>>> getvars(myvar)
{'a': 'A', 'b': 'B'}

>>> for i in getvars(myvar):
    print getattr(myvar, i)   # or use setattr to modify the attribute value

A Var
B Var
Run Code Online (Sandbox Code Playgroud)