Должен ли super () .__ str __ () в Brython возвращать что-то другое? - PullRequest
3 голосов
/ 23 апреля 2020

Я столкнулся со странной ситуацией, используя Brython и наследование с помощью метода str . Вот мой тест с использованием консоли Brython :

>>> class A(object):
...     def __str__(self):
...         return "A __str__ output."
... 
>>> class B(A):
...     def __str__(self):
...         return super().__str__() + " (from B)"
... 
>>> x = A()
>>> x
<__main__.A object>
>>> y = B()
>>> y
<__main__.B object>
>>> str(y)
"<super: <class 'B'>, <B object>> (from B)"

Я ожидал, что эта последняя строка вернется:

"A __str__ output. (from B)"

Я что-то здесь не так делаю?

Ответы [ 2 ]

4 голосов
/ 23 апреля 2020

Тот же код отлично работает в CPython, так что это, вероятно, ошибка Brython.

Python 3.7.6 (default, Dec 30 2019, 19:38:26)
[Clang 11.0.0 (clang-1100.0.33.16)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> class A(object):
...     def __str__(self):
...         return "A __str__ output."
...
>>> class B(A):
...     def __str__(self):
...         return super().__str__() + " (from B)"
...
>>> x = A()
>>> x
<__main__.A object at 0x1048de590>
>>> y = B()
>>> y
<__main__.B object at 0x1048de790>
>>> str(y)
'A __str__ output. (from B)'
>>>
0 голосов
/ 23 апреля 2020

Это не обязательно ошибка, это также может быть поведение, зависящее от реализации c. Поведение функции super () также изменилось в Pyhton, поэтому вам необходимо убедиться, что вы используете правильную форму и проверить совместимую реализацию.

В вашем случае происходит то, что вы печатаете строковое представление прокси-объекта, возвращаемого super() вместо , вызывая __str__ для фактического родительского объекта .

Подробнее см. здесь: https://docs.python.org/3/library/functions.html#super

...