在Python中对__repr__使用intropection

时间:2015-03-01 11:58:01

标签: python introspection

我有一个自定义类,可以有1到n个属性。 如何打印我的对象以查看属性及其值?

我试过这样的事情:

def __repr__(self):
    return str(inspect.getmembers(self))

但是我达到了最大的递归深度(对我来说有一些不明原因)。

2 个答案:

答案 0 :(得分:2)

您可以使用vars([object])函数返回模块,类,实例或具有__dict__属性的任何其他对象的__dict__属性。

car = Car()
vars(car)
# { 'color': 'red', 'manufacturer': 'Toyota' }

答案 1 :(得分:1)

仅供将来参考,您获得无限循环的原因如下:

  1. inspect.getmembers实现为:

    def getmembers(object, predicate=None):
        results = []
        for key in dir(object):
            try:
                value = getattr(object, key)
            except AttributeError:
                continue
            if not predicate or predicate(value):
                results.append((key, value))
        results.sort()
        return results
    
  2. 归结为:

    class Foo:
        def __repr__(self):
            try: v = getattr(self, "__repr__")
            except AttributeError:  pass
        return str(v) #str is a mandatory return type for __repr__
    
  3. 所以基本上是因为你定义了一个__repr__方法;它是您班级的一个属性,try-except块不会pass超过getattr语句。 getattr将检索__repr__方法并尝试转换为str类型,这是__repr__的强制返回类型。再次调用__repr__来创建绑定方法的字符串表示,调用inspect.getmembers再次调用getattr并进入无限循环。感谢Jonas Wielicki清理它。

    (如果您需要评论的背景信息,请参阅revision 2,我已将其删除,因为它是错误的和偏离主题的)