2016-07-08 2 views
0
class A(object): 
    def xx(self): 
     return 'xx' 


class B(A): 
    def __repr__(self): 
     return 'ss%s' % self.xx 

b = B() 
print repr(b) 

Когда я писал __repr__ метод, я забыл позвонить self.xx.максимальная глубина рекурсии превышено при Exec `магнезии()`

Почему этот код вызывает RuntimeError: maximum recursion depth exceeded while getting the str of an object.

Мой английский плохой, надеюсь, вы, ребята, сможете это понять. Большое спасибо!

+0

@skyking: да, ОП осознает это. Они заявляют * в вопросе *, что они забыли назвать 'self.xx'. –

ответ

4

Это то, что происходит:

  • %s на self.xx звонки str(self.xx)
  • метод не имеет __str__, так __repr__ называется на ней вместо этого.
  • __repr__ для метода вобрал в repr() из self в <bound method [classname].[methodname] of [repr(self)]>:

    >>> class A(object): 
    ...  def xx(self): 
    ...   pass 
    ... 
    >>> A().xx 
    <bound method A.xx of <__main__.A object at 0x1007772d0>> 
    >>> A.__repr__ = lambda self: '<A object with __repr__>' 
    >>> A().xx 
    <bound method A.xx of <A object with __repr__>> 
    
  • В __repr__ из self пытается использовать 'ss%s' % self.xx

и поэтому у вас есть бесконечный цикл.

Смежные вопросы