Возможно, это слишком общий вопрос, но это меня беспокоит. В общем, что лучше (и почему): проксирование или подклассов базового класса? К base Я имею в виду один из стандартных классов, который обычно даже не реализован в Python.Проксирование или подклассы базовых классов?
Более конкретный вопрос заключается в следующем: я хочу создать объект для графов графа; край графа - это по существу пара двух вершин. Вершиной может быть любой хешируемый объект. Я хочу, чтобы ребро выставило еще много методов, чем раскрывает frozenset
. Так интересно, я должен
class Edge(frozenset):
def my_method(self, *args):
return 3
или
class Edge(object):
def __init__(self, *args):
self._frozenset = frozenset(*args)
def __len__(self):
return len(self._frozenset)
def ...
Польза первого метода заключается в том, что я должен написать меньше (так как я не должен дублировать все оригинальные методы). Второй способ выглядит, однако, более безопасным в некотором смысле. Он также более гибкий, поскольку он позволяет мне избежать некоторых методов, которые frozenset
предоставляет (например, difference
), если я желаю.
Первый метод также вводит проблему с количеством переданных аргументов. Я, вероятно, должен перезаписать frozenset.__new__
, если я хочу это контролировать. С другой стороны, первый метод, вероятно, будет быстрее в целом, поскольку проксирование создает некоторые накладные расходы.
Я не знаю, имеет ли это значение, но я обычно пишу для Python 2.7.
Спасибо. Однако для меня это не так понятно. Я считаю, что люди с более абстрактным мышлением хотели бы иметь возможность проверять такие вещи, как 'if edge1() & edge2()' (например, 'edge1' и' edge2' пересекаются - как множества). – Bach
В любом случае, для меня Edge ** является ** неизменным набором. Тем не менее, существует довольно много суеты с подклассом «frozenset», поэтому я не уверен, что это правильная вещь. – Bach
Ну, если это всего лишь набор, то ... используйте набор. Если не требуется никакого специального смысла или функциональности, зачем даже создавать собственный класс? – bgusach