Вызов метода базового класса Python: неожиданное поведение - PullRequest
5 голосов
/ 23 апреля 2009

Почему str(A()), по-видимому, вызывает A.__repr__(), а не dict.__str__() в примере ниже?

class A(dict):
    def __repr__(self):
        return 'repr(A)'
    def __str__(self):
        return dict.__str__(self)

class B(dict):
    def __str__(self):
        return dict.__str__(self)

print 'call: repr(A)  expect: repr(A)  get:', repr(A())   # works
print 'call: str(A)   expect: {}       get:', str(A())    # does not work
print 'call: str(B)   expect: {}       get:', str(B())    # works

Выход:

call: repr(A)  expect: repr(A)  get: repr(A)
call: str(A)   expect: {}       get: repr(A)
call: str(B)   expect: {}       get: {}

Ответы [ 3 ]

9 голосов
/ 23 апреля 2009

str(A()) звонит __str__, в свою очередь звонит dict.__str__().

dict.__str__() возвращает значение repr (A).

3 голосов
/ 23 апреля 2009

Я изменил код, чтобы очистить вещи:

class A(dict):
   def __repr__(self):
      print "repr of A called",
      return 'repr(A)'
   def __str__(self):
      print "str of A called",
      return dict.__str__(self)

class B(dict):
   def __str__(self):
      print "str of B called",
      return dict.__str__(self)

И вывод:

>>> print 'call: repr(A)  expect: repr(A)  get:', repr(A())
call: repr(A)  expect: repr(A)  get: repr of A called repr(A)
>>> print 'call: str(A)   expect: {}       get:', str(A())
call: str(A)   expect: {}       get: str of A called repr of A called repr(A)
>>> print 'call: str(B)   expect: {}       get:', str(B())
call: str(B)   expect: {}       get: str of B called {}

Это означает, что функция str вызывает функцию repr автоматически. И поскольку он был переопределен для класса A, он возвращает «неожиданное» значение.

2 голосов
/ 02 ноября 2009

Я опубликовал обходное решение для него. Проверьте это ... вы можете найти это полезным: http://blog.teltub.com/2009/10/workaround-solution-to-python-strrepr.html

P.S. Прочитайте оригинальный пост, где я также представил эту проблему ... Проблема в неожиданном поведении, которое застает вас врасплох ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...