我是一个退出的新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)
可以将其视为报告问题......
答案 0 :(得分:3)
你做不到。值无法知道哪个变量引用它。
原因很简单;你可以让多个变量引用相同的值:
mypoint3 = mypoint1
现在该实例有什么名称?
答案 1 :(得分:1)
正如@MartijnPieters所说,这些无法获取实例的变量名称。解释后不会保留姓名。
但如果你确实有特殊需要,我认为你至少有两种方法。
假设您有一个类MyInstance
的实例MyClass
,然后是
str(MyInstance)
将为您提供string
<__main__.MyClass instance at 0x1044b6f80>
,它在运行时唯一地表示MyInstance
。您可能希望将其用作实例的名称。
在类的构造中明确定义“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
搜索循环会在找到其中一个后立即停止。可以修改它以找到它们,我想......