0

私は非常に新しいpythonプログラマーであり、好奇心のために、メインの本体で作成されたインスタンスの名前に到達する方法を知りたいと思っていますクラスのメソッドで。クラスの組み込みメソッドがあるかどうか、または自分で管理する必要があるかどうかを知りたいです。ところで、私はリストや辞書を使いたくありません。サンプルコードは次のとおりです。

class Vec2D(object):
   def __init__(self,X, Y):
     self.x=X
     self.y=Y
     print "X coordinate is ",self.x # I want to add it here 
     print "Y coordinate is ",self.y # and here

if __name__ == '__main__':
    mypoint1 = Vec2D(0,1)
    mypoint2 = Vec2D(1,2)

レポートの問題と見なされる可能性があります...

4

3 に答える 3

3

できません。値は、どの変数がそれを参照しているかを知る方法がありません。

理由は非常に単純です。複数の変数に同じ値を参照させることができます。

mypoint3 = mypoint1

インスタンスの名前は何ですか?

于 2013-01-14T16:17:40.133 に答える
1

@MartijnPieters が言ったように、これらはインスタンスの変数名を取得する方法ではありません。名前は解釈後に保持されません。

しかし、特別なニーズがある場合は、少なくとも 2 つのアプローチがあると思います。

MyInstanceclassMyClassのインスタンスがあるとしましょう。

  1. str(MyInstance)stringlikeが表示され、実行時<__main__.MyClass instance at 0x1044b6f80>に一意に示されます。MyInstanceインスタンスの名前として使用したい場合があります。

  2. 次のように、クラスの構築で「名前」を明示的に定義します。

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

    . その後、次の方法でいつでも名前を取得できます。

    MyInstance = MyClass("Instance1")
    print MyInstance.name
    
于 2013-01-14T16:39:15.923 に答える
1

__init__()まず第一に、オブジェクトはまだ構築中であり、まだ割り当てられていないため、名前を出力できませんでした。たとえそうであったとしても、それが何であるかを知るための組み込みの方法は Python にはありません。

ただし、モジュールのグローバル名前空間で構築後にオブジェクトを検索することは可能です。これにより、次のようなことが可能になります。

class Vec2D(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        my_name = '<unknown>'
        namespace = globals().copy()
        for name,obj in namespace.items():
            if obj is self:
                my_name = name
                break
        return "\n".join(["{!r}:",
                          "  X coordinate is {}",
                          "  Y coordinate is {}"]).format(my_name, self.x, self.y)

if __name__ == '__main__':
    mypoint1 = Vec2D(0,1)
    mypoint2 = Vec2D(1,2)

    print mypoint1
    print mypoint2

出力:

'mypoint1':
  X coordinate is 0
  Y coordinate is 1
'mypoint2':
  X coordinate is 1
  Y coordinate is 2

ただし、同じオブジェクトに 2 つの名前がある場合、forいずれかが見つかるとすぐに検索ループが停止するため、これは絶対確実ではありません。それらをすべて見つけるように変更できると思います...

于 2013-01-14T18:15:58.553 に答える