在Python中对_repr___使用简介

在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

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

我试过这样的方法:

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
    insteadUse
    self.\uu dict\uuuu
    insteadUse
    self.\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
    方法,否