我正在用 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/