答案 0 :(得分:12)
答案 1 :(得分:2)
也许你可以澄清一下你在寻找什么?
目前您的描述根本没有描述Python。我们假设在您的示例中,A,B和C是类的名称:
class A(object) :
... def __init__(self) :
... self.x = 1
class B(A) :
... def __init__(self) :
... A.__init__(self)
... self.y = 1
然后可以将运行时实例创建为:
b = B()
如果查看运行时对象的字典,那么它自己的变量和属于其超类的变量之间没有区别。例如: DIR(b)中
[ ... snip lots of double-underscores ... , 'x', 'y']
所以对你的问题的直接回答是它已经如此工作,但我怀疑这对你没有多大帮助。没有显示的是方法,因为它们是类的命名空间中的条目,而变量位于对象的命名空间中。如果要在超类中查找方法,请使用前面回复中描述的mro()调用,然后查看列表中类的名称空间。
当我四处寻找更简单的JSON序列化方法时,我在pickle模块中发现了一些有趣的东西。一个建议是你可能想要挑选/取消对象,而不是自己编写来遍历hieracrchy。 pickle输出是一个ASCII流,你可以更容易地来回转换为JSON。 PEP 307有一些起点。
另一个建议是看一下__reduce__
方法,尝试一下你要序列化的对象,因为它可能就是你要找的东西。
答案 2 :(得分:0)
如果只需要一棵树(而不是菱形继承),有一种简单的方法可以做到。通过分支[object, [children]]
的嵌套列表表示树,并留下[object, [[]]]
。
然后,通过定义递归函数:
def classTree(cls): # return all subclasses in form of a tree (nested list)
return [cls, [[b for c in cls.__subclasses__() for b in classTree(c)]]]
您可以获取继承树:
class A():
pass
class B(A):
pass
class C(B):
pass
class D(C):
pass
class E(B):
pass
>>> classTree(A)
[<class 'A'>, [[<class 'B'>, [[<class 'C'>, [[<class 'D'>, [[]]]], <class 'E'>, [[]]]]]]]
这只是一个列表,因此很容易序列化。如果只需要名称,请用cls
替换cls.__name__
。
对于反序列化,您必须从文本中恢复课堂。如果您需要更多帮助,请提供问题的详细信息。