有没有办法让 class 对象通过持有它的变量名来代表自己?

Is there a way to make a class object represent itself by the variable name holding it?

我有以下代码,其中 info 参数可以是任何东西(str、int、list 等):

class MyClass():
  def __init__(self, info):
    self.info = info

object_1 = MyClass("Whatever 1")
object_2 = MyClass("Whatever 2")
object_3 = MyClass("Whatever 3")

my_list = [object_1, object_2, object_3]

print(my_list)

如果你运行它,你会得到以下结果:

[<MyClass object at 0x7f**********>, <MyClass object at 0x7f**********>, <MyClass object at 0x7f**********>]

但我想print(my_list)打印这个:

[object_1, object_2, object_3]

有没有办法做到这一点,而不向 __init__ 函数定义(例如 def __init__(self, info, representation):)添加另一个参数并定义返回其值的 __repr__(例如 return representation)?

如果您对同一个变量有多个引用,这将变得非常难以使用。您最好的选择是拥有某种注册表 class 来跟踪 class 的所有哈希值并仅引用注册表对象,可能包含一个 __iter__ 方法。

我真的不建议这样做,而且我不确定如何让它在面对各种复杂情况时变得健壮,例如 class 和不同模块中的变量,或者对实例有多个绑定。

然而,出于各种注意事项,为了好玩,这里有一个概念验证,它假设 class 及其实例绑定在同一个模块中

import sys

class Magic:

    def __repr__(self):
        module = sys.modules[self.__class__.__module__]
        for name, object_ in vars(module).items():
            if object_ is self:
                return name
        else:
            return '<name not found>'


apple  = Magic()
banana = Magic()
cherry = Magic()

fruit = [apple, banana, cherry]
print(fruit)

这给出了输出

[apple, banana, cherry]