Załóżmy, że chcę niestandardowy frozenset
z 2 elementami, który wykonuje iteracje, hasze, porównuje i ma różne inne ładne operacje jako zamrożone, ale drukuje inaczej.Dostosowywanie niezmiennych typów w języku Python
>>> p = edge(5, 7)
>>> p == edge(7, 5)
True
>>> p
edge(5, 7)
Mogę dziedziczyć, lub mogę delegować, ale w żadnym przypadku nie dostaję tego, czego chcę.
Jeśli dziedziczę dosłownie, wydaje się, że nie ma mowy o napisaniu __init__
, ponieważ mój rodzic jest niezmienny. I może wystarczy napisać:
class edge:
def __new__(cls, a, b):
return frozenset({a, b})
ale potem dostaję właściwego frozenset i nie można dostosować jego __repr__
, czyli to, co chciałem zrobić. Nie mogę sprawić, aby super()
działało tutaj w jakikolwiek przyjemny sposób.
Jeśli deleguję, mogę przesłonić __getattr__
lub __getattribute__
, ale żadna z nich nie działa tak naprawdę, gdy szuka się na przykład __iter__
. Sądzę, że specjalne metody są tutaj zbyt szczególne. Jedynym rozwiązaniem, jakie mam obecnie, jest ręczne delegowanie każdej specjalnej metody, jaką mogę wymyślić, ale z pewnością musi istnieć lepszy sposób. Jakieś pomysły?
Nie jestem pewien, co chcesz zrobić. Czy chcesz zmienić '__repr__', czy też chcesz również zmienić' __init__'? Ponieważ nie ma potrzeby zastępowania '__init__', jeśli chcesz tylko zmienić' __repr__'. – TheBlackCat
Zmiana '__repr__' była priorytetem. Ale pomyślałem, że równie dobrze mogę zmienić konstrukcję nowych krawędzi, aby usunąć niepotrzebne {} s, gdy piszę nową klasę. – Veky