2017-10-09 79 views
0

我有下面的代码,其中info参数可以是任何东西(STR,INT,列表等):有没有办法让一个类对象通过持有它的变量名来表示自己?

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__函数定义(例如(例如return representation)?

+2

您想要显示变量名称作为表示?!?如果同一个对象被两个不同的变量引用会怎么样? – schwobaseggl

+0

只需使用“__init__'函数定义的另一个参数”。这很明显 - 易于使用和维护。所有将变量名称链接到实际Python对象的解决方案都将变得脆弱而且不易使用。 – MSeifert

+0

@MSeifert这就是为什么我问“如果有可能这样做”。当然,我最初可以为__init__添加另一个参数,但我也想知道是否可以完成我所问过的事情。 –

回答

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] 
+0

只要你想在当前模块之外创建它们就会中断(你提到过,但我想再次强调一下)。我其实不会建议试图鼓励为不应该解决的问题寻找解决方案(至少不是以问题所要求的方式),即使它们很有趣。 – MSeifert

+0

@MSeifert ...这就是为什么我开始我的答案,说我真的不建议这样做,并暗示它不会跨越不同的模块。 – jacg

+0

是的,我知道。我只是想“强调这一点”。 – MSeifert

2

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

相关问题