我有一个自定义类,可以有1到n个属性。 如何打印我的对象以查看属性及其值?
我试过这样的事情:
def __repr__(self):
return str(inspect.getmembers(self))
但是我达到了最大的递归深度(对我来说有一些不明原因)。
答案 0 :(得分:2)
您可以使用vars([object])
函数返回模块,类,实例或具有__dict__
属性的任何其他对象的__dict__
属性。
car = Car()
vars(car)
# { 'color': 'red', 'manufacturer': 'Toyota' }
答案 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
归结为:
class Foo:
def __repr__(self):
try: v = getattr(self, "__repr__")
except AttributeError: pass
return str(v) #str is a mandatory return type for __repr__
所以基本上是因为你定义了一个__repr__
方法;它是您班级的一个属性,try-except
块不会pass
超过getattr
语句。 getattr
将检索__repr__
方法并尝试转换为str
类型,这是__repr__
的强制返回类型。再次调用__repr__
来创建绑定方法的字符串表示,调用inspect.getmembers
再次调用getattr
并进入无限循环。感谢Jonas Wielicki清理它。
(如果您需要评论的背景信息,请参阅revision 2,我已将其删除,因为它是错误的和偏离主题的)