У меня есть класс:
class MyClass:
def__init__( self, name : str ) -> None:
self.__name : str = name
self.extra : object = None
def __eq__( self, other : object ) -> bool:
if not isinstance( other, MyClass ):
return False
return self.__name == other.__name
def __hash__( self ) -> int:
return hash( self.__name )
Таким образом, __name неизменен, и два MyClass равны, если они используют один и тот же __name.
У меня есть набор, определенный таким образом:
eggs = MyClass( "eggs" )
beans = MyClass( "beans" )
spam = MyClass( "spam" )
c.extra = "spam spam spam"
my_set : Set[MyClass] = { eggs, beans, spam }
Я могу проверить, есть ли spam в моем наборе:
has_spam : bool = MyClass( "spam" ) in my_set
Но как мне получить "spam.extra" по имени? Я мог бы использовать dict, но для этого потребуется дублировать свойство name, или я мог бы повторить итерацию, но это кажется расточительным.






Невозможно делать то, что вы хотите, с набором, о котором я знаю (за исключением итерации всего этого). Насколько я понимаю, единственный способ получить что-либо из набора - это перебрать его или использовать set.pop, который дает вам произвольный элемент набора.
Вы можете использовать словарь для сопоставления того, что вы назвали __name, с extra (и избегайте использования каких-либо настраиваемых классов), т.е.
my_set = {"eggs": "some extra data", "beans": None, "spam": None}
Это похоже на тот случай, когда вы хотели бы использовать словарь, если нет дополнительных требований, о которых вы не упомянули.