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

标签 python reflection introspection

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

因此,我认为递归地内省(introspection)要发出的 Python 类层次结构的优雅解决方案,然后在返回树的过程中,在 Python 基本类型中安装正确的值。

E.g.,

A
|
|\
| \
B  C

如果我在 B 上调用我的“内省(introspection)”例程,它应该返回一个字典,其中包含从 A 的所有变量到它们的值的映射,以及 B 的变量和它们的值。

就目前而言,我可以查看 B.__slots__B.__dict__,但我只能从那里提取 B 的变量名。

如果只给定 B,如何获得 A 的 __slots__/__dict__? (或 C)。

我知道 python 不像 C++ 那样直接支持转换,它的后代也支持-

最佳答案

您可以尝试使用 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'>]

>>> type(b).mro()

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

>>> 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

关于python - 在运行时递归遍历 Python 继承树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3321029/

相关文章:

javascript - 作为参数传递的函数参数

java - Boolean.FALSE 不等于 false

java - 如何让 Spring 接受流畅(非 void)的 setter ?

objective-c - 获取字符串形式的属性名称

python - 从 Python Panda 到交叉过滤器的列平均值计算不正确

python - BeautifulSoup 用原始 xml 替换标签而不解析/转义

python - 在 Python 中使用 NLTK 找韵

c# - 如何测试 MethodInfo.ReturnType 是否为 System.Void 类型?

python - 在 Shell 中查找 Python 类属性

python - lxml doc.find 返回 None