Вот пример явления, на которое я смотрю:
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__
, но пока не повезло.