如何到达类的实例名称?

时间:2013-01-14 16:17:00

标签: python instances

我是一个退出的新python程序员,只是出于好奇,我想知道如何在我班级的方法中达到在main主体中创建的实例的名称。我想知道是否有一个内置的类方法,或者我应该自己管理它。顺便说一下,我不想使用列表或词典。示例代码如下:

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)

可以将其视为报告问题......

3 个答案:

答案 0 :(得分:3)

你做不到。值无法知道哪个变量引用它。

原因很简单;你可以让多个变量引用相同的值:

mypoint3 = mypoint1

现在该实例有什么名称?

答案 1 :(得分:1)

正如@MartijnPieters所说,这些无法获取实例的变量名称。解释后不会保留姓名。

但如果你确实有特殊需要,我认为你至少有两种方法。

假设您有一个类MyInstance的实例MyClass,然后是

  1. str(MyInstance)将为您提供string <__main__.MyClass instance at 0x1044b6f80>,它在运行时唯一地表示MyInstance。您可能希望将其用作实例的名称。

  2. 在类的构造中明确定义“name”,如:

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

    。之后,您始终可以通过以下方式获取名称:

    MyInstance = MyClass("Instance1")
    print MyInstance.name
    

答案 2 :(得分: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

然而,这并非万无一失,因为如果同一个对象有两个名称,for搜索循环会在找到其中一个后立即停止。可以修改它以找到它们,我想......