在Python中是否有一种方法,我可以使用变量值来创建类实例
class Test(object):
def __init__(self, object):
self.name = object
print "Created Object :",self.name
a1 = Test('a1')
print a1.name
b2 = 'a2'
b2 = Test(b2)
print a2.name
在这个例子中,我希望类实例名称分别为'a1'和'a2'。我不能直接使用值'a2',因为它是从其他进程计算的,但类实例名称必须匹配它才能访问它。
在上面的例子中,它给出了错误:
Created Object : a1
a1
Created Object : a2
Traceback (most recent call last):
File "D:\a\h", line 12, in <module>
print a2.name
NameError: name 'a2' is not defined
答案 0 :(得分:4)
每当你想动态创建变量名时,你需要停下来告诉自己字典是一种更好的方法。如果你想让类实例在任何地方可用(这也不是最好的主意),但是你可以这样做:
class Test(object):
instance_dict={}
def __init__(self,name):
self.name=name
self.instance_dict[name] = self
现在你可以使用这个类了:
a1 = Test("a1")
print a1 is Test.instance_dict["a1"] #True
b1 = Test("a2")
print b1 is Test.instance_dict["a2"] #True
换句话说,instance_dict
class属性会保留最近创建的具有特定名称的实例的句柄,因此您可以在Test
可用的任何位置处理实例。
但是,我不推荐这种类型的设计。这里的缺点与使用全局变量的缺点相同。它很可能很难维护,很难分清楚究竟是什么,等等,因为通过程序的数据流不是很好。
答案 1 :(得分:3)
最接近您要查找的内容是将所有实例存储在字典中:
class Test(object):
def __init__(self, n):
self.name = n
print "Created Object :",self.name
d = {}
d['a1'] = Test('a1')
print d['a1'].name
b2 = 'a2'
d[b2] = Test(b2)
print d['a2'].name
引用对象的变量名称与对象本身之间没有任何关联。
答案 2 :(得分:1)
请尝试print b2.name
。
注意:名称name
并不意味着Python有什么特别之处。 “为您的类命名”对Python来说没有任何意义,它只是执行您编写的代码。 “为你的班级命名”意味着你,但Python不能也不会读你的想法: - )
因此,将b2
引用的实例的名称设置为a2
并不会神奇地创建引用a2
。
对变量名称的介绍可能有所帮助:Learn to Program Using Python: Variables and Identifiers
简而言之,如果你写的话
a = 'x'
的Python
x
)a
如果你那么写:
b = a
内存中仍然只有一个字符串实例。您只创建了第二个别名b
,它引用了与a
相同的字符串实例。