Может ли экземпляр возвращать значения, отличные от строкового представления __repr__? - PullRequest
0 голосов
/ 29 апреля 2020

Вот пример явления, на которое я смотрю:

class Person:
    def __init__(self, name, other):
        self.name = name
        self.other = other

class Name():
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname

    def __repr__(self):
        return self.firstname + " " + self.lastname

class Other():
    def __init__(self, age, stats):
        self.age = age
        self.stats = stats
        self.other = (self.age, self.stats)

    def __repr__(self):
        return (self.age, self.stats)

person_one = Person(Name("John", "Doe"), Other(29, [1, 2, 3]))

print(person_one.name.firstname)
print(person_one.name.lastname)
print(person_one.name.name)
print(person_one.name)

print(person_one.other.age)
print(person_one.other.stats)
print(person_one.other.other)
print(person_one.other)

Все будет работать нормально, кроме самой последней строки кода, которая приведет к ошибке TypeError. Это потому, что методы __repr__ / __str__ magi c не будут возвращать ничего, кроме строки.

Так что мой вопрос, есть ли способ получить подобную функциональность, которая может возвращать не-строки? Я имею в виду, кроме использования редупликативных переменных экземпляра, как при использовании person_one.name.name и person_one.other.other?

Я видел кое-что, что предполагало, что это возможно с помощью метода ___new___ magi c, но я не уверен, как это будет работать.

Я знаю, что это не имеет большого значения, и, пожалуйста, просто скажите мне, если это вообще невозможно, но это просто кажется очень удобной и логичной структурой чтобы иметь возможность использовать.

РЕДАКТИРОВАТЬ:

Кажется, я могу получить часть пути там, изменив __call__.

Например, если я добавлю в class Other():

def __call__(self):
        return (self.age, self.stats)

Теперь person_one.other() вернет кортеж. Но все равно было бы неплохо, если бы я мог заставить person_one.other сам возвращать кортеж (без уничтожения способности person_one.other.age et c. Возвращать то, что они хотят). Я смотрю на __getattribute__, но пока не повезло.

...