在Python中对_repr___使用简介
我有一个自定义类,它可以有1到n个属性。 如何打印对象以查看属性及其值 我试过这样的方法:在Python中对_repr___使用简介,python,introspection,Python,Introspection,我有一个自定义类,它可以有1到n个属性。 如何打印对象以查看属性及其值 我试过这样的方法: def __repr__(self): return str(inspect.getmembers(self)) 但我达到了最大递归深度(因为一些我不清楚的原因) 您可以使用该函数,该函数将返回模块、类、实例或任何其他具有\uuuuu dict\uuu属性的对象的\uuu dict\uuuu属性 car = Car() vars(car) # { 'color': 'red', 'manufac
def __repr__(self):
return str(inspect.getmembers(self))
但我达到了最大递归深度(因为一些我不清楚的原因) 您可以使用该函数,该函数将返回模块、类、实例或任何其他具有\uuuuu dict\uuu
属性的对象的\uuu dict\uuuu
属性
car = Car()
vars(car)
# { 'color': 'red', 'manufacturer': 'Toyota' }
您可以使用该函数,该函数将返回模块、类、实例或具有\uuuuuu dict\uu
属性的任何其他对象的\uuuu dict\uu
属性
car = Car()
vars(car)
# { 'color': 'red', 'manufacturer': 'Toyota' }
您可以使用该函数,该函数将返回模块、类、实例或具有\uuuuuu dict\uu
属性的任何其他对象的\uuuu dict\uu
属性
car = Car()
vars(car)
# { 'color': 'red', 'manufacturer': 'Toyota' }
您可以使用该函数,该函数将返回模块、类、实例或具有\uuuuuu dict\uu
属性的任何其他对象的\uuuu dict\uu
属性
car = Car()
vars(car)
# { 'color': 'red', 'manufacturer': 'Toyota' }
不过,仅供将来参考,获得无限循环的原因如下:
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__
\uuuuu repr\uuuu
方法;它是类的一个属性,try except
块将不会通过getattr
语句getattr
将检索\uuu repr\uuuu
方法并尝试转换为str
类型,这是\uuu repr\uuu
的强制返回类型<再次调用code>\uuu repr\uu
以创建绑定方法的字符串表示形式,该方法调用inspect.getmembers
,该方法再次调用getattr
,并进入无限循环。感谢Jonas Wielicki把这件事弄清楚了
(请参阅是否需要注释的上下文,我已将其截断,因为它是错误的和离题的)只是为了将来的参考,但得到无限循环的原因如下:
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__
\uuuuu repr\uuuu
方法;它是类的一个属性,try except
块将不会通过getattr
语句getattr
将检索\uuu repr\uuuu
方法并尝试转换为str
类型,这是\uuu repr\uuu
的强制返回类型<再次调用code>\uuu repr\uu
以创建绑定方法的字符串表示形式,该方法调用inspect.getmembers
,该方法再次调用getattr
,并进入无限循环。感谢Jonas Wielicki把这件事弄清楚了
(请参阅是否需要注释的上下文,我已将其截断,因为它是错误的和离题的)只是为了将来的参考,但得到无限循环的原因如下:
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__
\uuuuu repr\uuuu
方法;它是类的一个属性,try except
块将不会通过getattr
语句getattr
将检索\uuu repr\uuuu
方法并尝试转换为str
类型,这是\uuu repr\uuu
的强制返回类型<再次调用code>\uuu repr\uu
以创建绑定方法的字符串表示形式,该方法调用inspect.getmembers
,该方法再次调用getattr
,并进入无限循环。感谢Jonas Wielicki把这件事弄清楚了
(请参阅是否需要注释的上下文,我已将其截断,因为它是错误的和离题的)只是为了将来的参考,但得到无限循环的原因如下:
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__
\uuuuu repr\uuuu
方法;它是类的一个属性,try except
块将不会通过getattr
语句getattr
将检索\uuu repr\uuuu
方法并尝试转换为str
类型,这是\uuu repr\uuu
的强制返回类型<再次调用code>\uuu repr\uu
以创建绑定方法的字符串表示形式,该方法调用inspect.getmembers
,该方法再次调用getattr
,并进入无限循环。感谢Jonas Wielicki把这件事弄清楚了
(看看你是否需要上下文来评论,我已经把它删掉了,因为它是错误的和离题的)使用
self.\uu dict\uuuu
insteadUseself.\uu dict\uuuu
insteadUseself.\uu dict\uuu
insteadUse。一个getattr(self,“\uuu repr\uuu”)
将返回关联的函数对象,如果有,则不调用它。@martineau我没有你那么确定。似乎\uuuu repr\uuuu
更像是表面下的类属性,而不是函数,尽管它是一个方法。在执行过程中的某一点(在打印时或在getattr
)\uuu repr\uu
必须进行评估。请参见上面的编辑。将inspect.getmembers()的结果转换为str后,将调用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu repr\uuuuuu
来创建绑定方法的字符串表示形式,正如您所注意的,这些方法需要\uuuuuuuuuuuuuuuuuuuuur\uuuuuuu。因此,无限递归。不需要魔法。@JonasWielicki谢谢你,我应该更小心,我已经编辑了答案以匹配正确的答案。绑定方法是
的对象。这些对象有一个内置的\uuuuu repr\uuuuu
方法,因此hasattr(getattr(b,“\uuu repr\uuuuu”),“\uuuuu repr\uuuuu”)
-->True
。当试图打印一个绑定的方法对象时,会调用其\uuuuu repr\uuuu
方法,否