1

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
4

3 回答 3

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类属性为最近创建的具有特定名称的实例保留一个句柄,因此您可以在任何Test可用的实例上拥有一个句柄。

但是,我不推荐这种设计。这里的缺点与使用全局变量的缺点相同。它可能会变得难以维护,难以分辨到底发生了什么等等,仅仅是因为通过您的程序的数据流没有很好地排序。

于 2012-08-02T13:05:40.853 回答
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

引用对象的变量的名称与对象本身之间没有联系。

于 2012-08-02T13:19:48.393 回答
1

试试print b2.name吧。

注意:该名称name对 Python 没有任何特殊意义。“给你的类一个名字”对 Python 没有任何意义,它只是执行你编写的代码。“给你的班级起个名字”对来说意义重大,但 Python 不能也不会读懂你的想法 :-)

b2因此,设置to引用的实例的名称a2并不会神奇地创建一个 reference a2

对变量名的介绍可能会有所帮助:Learn to Program Using Python: Variables and Identifiers

简而言之,如果你写

a = 'x'

Python

  1. 创建一个字符串实例
  2. 为该字符串实例(文本x)分配一个值
  3. 将此新字符串实例的引用分配给别名a

如果你然后写:

b = a

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

于 2012-08-02T13:05:59.937 回答