2017-10-09 77 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__方法。

相關問題