Предположим, что мне нужен пользовательский frozenset
с двумя элементами, который выполняет итерации, хеширует, сравнивает и выполняет различные другие приятные операции как фреззавет, но печатает по-разному.Настройка неизменяемых типов в Python
>>> p = edge(5, 7)
>>> p == edge(7, 5)
True
>>> p
edge(5, 7)
Я могу наследовать, или я могу делегировать, но ни в одном случае я не получаю то, что хочу.
Если я наследую буквально, похоже, я не могу написать __init__
, потому что мой родитель неизменен. Я может просто написать:
class edge:
def __new__(cls, a, b):
return frozenset({a, b})
, но затем я получаю правильный frozenset и не может настроить его __repr__
, что это то, что я хотел сделать. Я не могу сделать super()
, чтобы работать здесь красиво.
Если я делегирую, я могу переопределить __getattr__
или __getattribute__
, но ни один из них не работает, например, если, например, __iter__
. Я думаю, что специальные методы здесь слишком особенные. Единственное решение, которое я имею в настоящее время, - это вручную делегировать каждый специальный метод, о котором я могу думать, но, безусловно, должен быть лучший способ. Есть идеи?
Непонятно, что вы хотите сделать. Вы просто хотите изменить '__repr__', или вы также хотите изменить' __init__', тоже? Потому что вам не нужно переопределять '__init__', если вы хотите изменить' __repr__'. – TheBlackCat
Изменение параметра '__repr__' было приоритетным. Но я думал, что могу изменить конструкцию новых ребер, чтобы удалить ненужные {} s, когда я пишу новый класс. – Veky