我是一位努力学习Python的Java程序员,几乎可以肯定会问一个重复的问题。在我的Python代码中,我需要创建一个基本上包含列表的对象。实例化对象时,列表将为空。在代码的后面,我想添加项目:
Account Name Balance
YTD 10000
Interest 100
Depreciation 500
Less Distributions -7000
Plus Paid in Capital 600
Principal 2600
Result 100 //(i.e 10000/100)
运行上面的代码时,出现以下错误消息:
1 #!/usr/bin/python
2
3 class objWithList:
4 # myList # define a global variable here?
5 def __init__(self):
6 print "New Object created!"
7 myList = list() # tell Python "myList" is a list?
8 def addSomething(cls, x):
9 myList.append(x)
10
11 myObj = objWithList() # create the object
12 str1 = "Add me"
13 myObj.addSomething(str1) # add item to obj's list
因此看起来对象已成功创建,但是当我调用 me@myBox/python_Sandbox# ./test1.py
New Object created!
Traceback (most recent call last):
File "./test1.py", line 13, in <module>
myObj.addSomething(str1) # add item to obj's list
File "./test1.py", line 9, in addSomething
myList.append(x)
NameError: global name 'myList' is not defined
me@myBox/python_Sandbox#
时,列表未定义。那是因为一旦对象构造函数完成,在addSomething()
中创建的myList就会超出范围?将__init__()
命令移到类定义的顶部时,会收到相同的错误消息:
myList = list()
那么如何创建一个空列表,该列表在创建对象后可用?
我还应该补充一点,我正在编写Python 2.7。我的公司喜欢这个版本,所以我坚持使用它。不要问。
谢谢
答案 0 :(得分:1)
在Python中,__init__
和__new__
之间是有区别的。也就是说,当您的代码达到__init__
时,它已经“被构造”了。只有这样,您才能向实例添加新的“字段”,例如self.myList = []
中的__init__
。
def addSomething(cls, x)
的作用是,您可以将其命名为cls
,但实际上它是实例。因此,您应该改写self.myList.append()
。
答案 1 :(得分:1)
在__init__
函数中,myList
只是局部变量。使用self.myList
使其成为类成员。当然,也可以通过使用self self.myList.append(x)
在函数addSomething()中对其进行访问。另外,您还需要将方法addSomething的签名从addSomething(cls, x)
更改为addSomething(self, x)