创建类的实例
使用变量值有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
最接近的事对你在找什么是所有实例存储在词典:
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
有引用一个对象和对象本身的变量名称之间没有任何联系。
@sarbjit我已经在你的最后一个问题中告诉你了。 – 2012-08-02 13:28:13
@lazyr,我对它在函数中的用法感到困惑。无论如何非常感谢您的帮助! – sarbjit 2012-08-02 13:41:25
@sarbjit没问题。但是你真的应该至少查看[python教程](http://docs.python.org/tutorial/)的第3,4和5章,以便对事物的工作方式有一个基本的了解。如果你了解它们,那么它会塞满你一直需要的实用和漂亮的东西。 – 2012-08-02 13:48:10
要动态地创建变量名任何时候,你需要停下来,告诉自己,一本字典是一个更好的路要走。如果您希望类的实例是可在任何地方(这也是不是最好的主意),但这里是你如何能做到这一点:
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
可用的任何位置处理实例。
但是,我不推荐这种类型的设计。这里的缺点与使用全局变量的缺点相同。这可能会变得很难维护,很难说出究竟发生了什么,等等,只是因为通过你的程序的数据流没有很好的排序。
改为尝试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
相同的字符串实例。
不应该使用'object'作为变量名。疯狂的事情会发生。 – 2012-08-02 12:58:54
我不确定你想完成什么,但你永远不会定义'a2'。 – Makoto 2012-08-02 12:59:03
请参阅[OPs previous question](http://stackoverflow.com/questions/11775652/error-accessing-class-objects-in-python)上下文。 – 2012-08-02 12:59:55