【发布时间】:2021-08-20 17:06:34
【问题描述】:
考虑以下代码:
class DummyClass:
def __init__(self, name):
self.name = name
obj_1 = DummyClass("name_1")
obj_2 = DummyClass("name_2")
my_dict = {
obj_1: "value_1",
obj_2: "value_2"
}
print(my_dict)
输出
{<__main__.DummyClass object at 0x7f8f6493a0b8>: 'value_1', <__main__.DummyClass object at 0x7f8f649869e8>: 'value_2'}
此代码创建了一个字典 my_dict,其中包含 DummyClass 的实例作为键。
我想知道是否有可以在DummyClass 中覆盖的魔术函数(例如__something__),以便上面的代码产生以下输出:
{'name_1': 'value_1', 'name_2': 'value_2'}
其中name_1 和name_2 都是字符串,即DummyClass 实例的name 属性。
我不想更改可视化或打印,我想实际更改内存中的键。
【问题讨论】:
-
不知道为什么有人会反对。如果我不知道我正在寻找的函数的名称,我就找不到答案。
-
我可能错过了这里的重点,但在我看来
my_dict = {obj_1.name: "value_1", obj_2.name: "value_2" }会做你想做的事。 -
在这种特殊情况下,是的。但是有没有一种通用的模型方法可以让我写
my_dict = {obj_1: "value_1", obj_2: "value_2" }并得到与my_dict = {obj_1.name: "value_1", obj_2.name: "value_2" }相同的结果?看来我需要覆盖__repr__。 -
在我看来,您正在寻找 Delphi 所谓的 默认属性:它是裸类实例名称的 RH 值,您当然必须声明,否则是什么让
self.name优先于其他属性?但是 Python 没有我所知道的使一个属性比其他属性更重要的机制。我认为最好解释一下为什么您认为需要这种机制。 -
那么不,没有办法做到这一点。对象本身就是键,对于“当它被用作字典键时要用作键的实际值”没有神奇的方法。如上所述,您应该提供上下文,这将解决的问题。
标签: python