Согласно https://docs.python.org/2.7/library/stdtypes.html#set-types-set-frozenset ,
Объект множества неупорядоченная коллекция различных хеш-объектов.
blockquote>Согласно https://docs.python.org/2.7/glossary.html#term-hashable ,
Объект является хэшируемым, если он имеет хеш-значение, которое никогда не изменяется в течение срока его службы (для него требуется метод
blockquote>__hash__()
), и его можно сравнивать с другими объектами (для него требуется метод__eq__()
или__cmp__()
).У вас есть
__eq__
, поэтому все, что вам сейчас нужно, это__hash__
. (__ne__
также должно быть реализовано, или вы получите результаты, гдеx == y
не соответствуетnot (x != y)
.)class Point(object): def __init__(self, x, y): self.x = x self.y = y def __eq__(self, other): if isinstance(other, Point): return self.x == other.x and self.y == other.y return NotImplemented def __ne__(self, other) if isinstance(other, Point): return not (self == other) return NotImplemented def __hash__(self): return hash((self.x, self.y)) print(set([Point(1,2), Point(1,2)]))
Результат:
set([<__main__.Point object at 0x02F4F090>])
Для стиля точки, вы также можете захотеть реализовать
__repr__
, поэтому ваш объект set выглядит красиво. Добавьте вdef __repr__(self): return "Point({}, {})".format(self.x, self.y)
, и ваш набор будет отображаться какset([Point(1, 2)])
.
Это происходит всюду по Windows. Я не думаю, что они добавили что-либо специальное для обработки его в .NET.
Нормальное средство обработки этого
Количество времени, для которого Вы устанавливаете время, должно быть равно времени Двойного щелчка системы (который пользователь может указать в панели управления). Это доступно от Системы. Windows. Формы. SystemInformation. DoubleClickTime. Полное изложение находится в MSDN, здесь
Проблема - то, что большинство объектов не реализует обоих. Несколько объектов, которые могут обоснованно иметь различные действия для единственного и двойные щелчки обычно, в порядке для выполнения действия одиночного нажатия перед действием двойного щелчка (выделение затем открывают папку, вводят внимание на строку поиска прежде, чем выбрать его, и т.д.), единственный способ определить состоял бы в том, чтобы, вероятно, ожидать на одиночном нажатии количества времени и отменить действие для одиночного нажатия, если двойной щелчок обнаруживается.
Другое возможное решение состоит в том, чтобы иметь вызов функции OnMouseDoubleClick OnMouseClick. Так как действие в OnMouseClick является двоичным переключателем, называние его дважды сбрасывает его к тому же состоянию.
Таким образом, когда пользователь дважды щелкает, окна называет OnMouseClick, затем OnMouseDoubleClick. OnMouseDoubleClick называет OnMouseClick (снова) для восстановления состояния, затем обрабатывает двойной щелчок.
Это чувствует себя неудовлетворяющим как решение, но оно работает.
Используя таймер (для глотания первого щелчка двойного щелчка) является одинаково неудовлетворяющим, и имеет добавленную сложность обработки предпочтений уровня двойного щелчка пользователя.
С наилучшими пожеланиями, ограбьте
Вы могли запустить таймер в обработчике событий OnMouseClick.
Еще
Иначе
NB: Эта реализация имеет преимущество того, что и timeoput и радиус 'двойного щелчка' могут быть настроены независимо конфигурации системы, позволяющей s/w быть импортированным на несколько машин /