如何获取对象所在的地图密钥?

2024-04-26 05:30:56 发布

您现在位置:Python中文网/ 问答频道 /正文

是否有一种内置的方法来获取放置对象的字典键?你知道吗

class Example():
    def do_black_magic(self):
        return __builtin_magic__(self)

map = {0: Example()}
map[0].do_black_magic() # -> 0

map[1] = map.pop(0)
ma[1].do_black_magic() # -> 1

Tags: 对象方法selfmapreturn字典exampledef
1条回答
网友
1楼 · 发布于 2024-04-26 05:30:56

您可以实现一个管理反向映射的字典,但是您必须非常小心地使用反向映射中的键。你知道吗

出于示例的考虑,我非常天真地使用了对象的默认字符串表示形式。你肯定想用别的东西(比如在你的Example类中实现__eq____hash__)。你知道吗

from collections import UserDict

class MyDict(UserDict):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._reverse_mapping = {}

    def __setitem__(self, key, value):
        super().__setitem__(key, value)
        self._reverse_mapping[str(value)] = key

    def get_reversed_mapping(self, value):
        return self._reverse_mapping[str(value)]


class Example: pass


my_dict = MyDict()

obj_1 = Example()
my_dict[1] = obj_1
print(my_dict.get_reversed_mapping(obj_1))

obj_2 = Example()
my_dict[2] = obj_2
print(my_dict.get_reversed_mapping(obj_2))

输出

1
2

我强调得太多了:不要使用对象的字符串表示。如果这种表述发生变化,它将惨败:

class Example:
    def __init__(self, n):
        self.n = n

    def __str__(self):
        return str(self.n)


my_dict = MyDict()
obj = Example(1)
my_dict[1] = obj
print(my_dict.get_reversed_mapping(obj))
obj.n = 2
print(my_dict.get_reversed_mapping(obj))

输出

1
Traceback (most recent call last):
    return self._reverse_mapping[str(value)]
KeyError: '2'

相关问题 更多 >