时间:2010-07-23 18:02:44

标签: python reflection introspection

3 个答案:

答案 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__

对于反序列化,您必须从文本中恢复课堂。如果您需要更多帮助,请提供问题的详细信息。