0
0 Комментариев

Возьмем как пример парочку выдуманных классов:

import requests
 
class A:
    def __init__(self, a="string", b=10, c=["a", "b", "c", 1, 2, 3]):
        # параметр c - произвольной длины
        self.a = a
        self.b = b
        self.c = c
 
class B:
    def __init__(self, A_object):
        # A_object - объект типа A
        self.neighbor = A_object
        self.session = requests.Session()

1) Как следовало бы написать __repr__ и __str__ для этих классов?

2) Документация говорит о том, что __repr__ — это однозначное представление объекта в виде строки, которое можно использовать, чтобы воссоздать точно такой же объект, а если это невозможно, то вывести какое-нибудь полезное сообщение. Очень похоже, что требуется сериализовать объект таким образом. В чем же тогда отличие от связки __getstate__, __setstate__? Эти два метода тоже могут запросто строку вернуть и требования у этой строки такие же — однозначное представление объекта. Зачем же дублирование?

И наоборот, как замену getstate, setstate можно придумать следующее:

def __repr__(self):
    return "A({a}, {b}, {c})".format(a=self.a, b=self.b, c=self.c)

а потом вызывать это:

A1 = A()
A2 = eval(A1.__repr__())

3) Та же самая документация говорит, что __str__ — должен вывести красивое, читабельное информационное сообщение, отражающее объект. Как тогда различить результат этого метода и какое-нибудь полезное сообщение из __repr__?

4) Далеко не всегда можно представить какой-то объект в виде строки. Например, функции, длинные коллекции, другие объекты без str и без repr. Выходит, что в этом случае либо не выполняется требование __repr__, либо необходимо для всех подобных объектов вывести содержание __dict__, что хранит значение всех-всех методов и переменных. Выглядит это решение плоховато, что же делать?

5) Возвращаясь к документации __repr__ — можно пример ситуации, когда невозможно однозначно представить объект как строку? Объекты ведь не имеют к квантовому миру никакого отношения — они ВСЕГДА детерминированы, всегда есть набор переменных и набор методов. но не зря же в документации эта строка?

6) А еще есть __format__, который тоже должен возвращать строку…


Добавить комментарий