有没有办法让类对象通过保存它的变量名来表示自己?

时间:2017-10-09 11:42:11

标签: python python-3.x class repr

我有以下代码,其中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 )?

2 个答案:

答案 0 :(得分:2)

如果您对同一个变量有多个引用,这将变得非常难以使用。你最好的办法是拥有一种跟踪类的所有哈希值的Registry类,并且只引用Registry对象,可以概括地包含__iter__方法。

答案 1 :(得分:0)

我并不是真的建议这样做,而且我不确定如何在遇到各种复杂情况时使其变得强大,例如类和变量在不同的模块中,或者多个绑定到实例。

然而,有了各种各样的警告,只是为了好玩,这里是一个概念验证,它假设类及其实例绑定在同一个模块中

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]