2017-10-09 8 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] 

そうする方法はありますが関数定義(例:その値を返す__repr__を定義する(例えば、return representation)?

+2

変数名を表現として表示しますか?同じオブジェクトが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__メソッドを含むレジストリクラスを持つことです。

関連する問題