使用变量值创建类实例

时间:2012-08-02 12:57:31

标签: python

在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

3 个答案:

答案 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

  1. 创建字符串实例
  2. 为该字符串实例(文本x
  3. 指定一个值
  4. 将此新字符串实例的引用分配给别名a
  5. 如果你那么写:

    b = a
    

    内存中仍然只有一个字符串实例。您只创建了第二个别名b,它引用了与a相同的字符串实例。