0

我是一个退出的新 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)

它可以被视为一个报告问题...

4

3 回答 3

3

你不能。一个值无法知道哪个变量引用了它。

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

mypoint3 = mypoint1

现在实例有什么名字?

于 2013-01-14T16:17:40.133 回答
1

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

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

假设您有一个MyInstanceclass实例MyClass,那么

  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

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

于 2013-01-14T18:15:58.553 回答