我有一个班级:
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
属性,或者我可以迭代,但这看起来很浪费。
答案 0 :(得分:1)
没有办法用我所知道的集合做你想要的事情(没有迭代整个事情)。据我了解,从集合中获取任何东西的唯一方法是迭代它或使用set.pop
,这将获得集合中的任意元素。
您可以使用字典将您称之为__name
的内容映射到extra
(并避免使用任何自定义类),即
my_set = {"eggs": "some extra data", "beans": None, "spam": None}
这似乎就是你想要使用字典的情况,除非你还没有提到更多的要求。