2015-04-20 5 views
5

Предположим, что мне нужен пользовательский 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__. Я думаю, что специальные методы здесь слишком особенные. Единственное решение, которое я имею в настоящее время, - это вручную делегировать каждый специальный метод, о котором я могу думать, но, безусловно, должен быть лучший способ. Есть идеи?

+1

Непонятно, что вы хотите сделать. Вы просто хотите изменить '__repr__', или вы также хотите изменить' __init__', тоже? Потому что вам не нужно переопределять '__init__', если вы хотите изменить' __repr__'. – TheBlackCat

+0

Изменение параметра '__repr__' было приоритетным. Но я думал, что могу изменить конструкцию новых ребер, чтобы удалить ненужные {} s, когда я пишу новый класс. – Veky

ответ

2

Глупо меня. Он работает сейчас. Если кто-то хочет знать, как это сделать, вот это:

class pair(frozenset): 
    def __new__(cls, a, b): 
     return super().__new__(cls, {a, b}) 
    def __repr__(self): 
     a, b = sorted(self) 
     return "{} & {}".format(a, b) 

Ошибка в том, что я назвал super().__new__({a, b}) думая, что это будет мой cls превращать точно так же он делает с self, при вызове без аргументов. Конечно, __new__ неявно classmethod не помог. :-)