如何创建包含空列表的 Python 对象
How to create a Python object that holds an empty list
我是一名 Java 努力学习 Python 的程序员,而且几乎肯定会问一个重复的问题。在我的 Python 代码中,我需要创建一个基本上包含列表的对象。当一个对象被实例化时,列表是空的。在代码的后面,我想添加项目:
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()
时,列表没有定义。那是因为一旦对象构造函数完成,在 __init__()
中创建的 myList 就超出了范围吗?当我将 myList = list()
命令移动到 class 定义的顶部时,我收到相同的错误消息:
3 class objWithList:
4 myList = list() # moved list creation here
5 def __init__(self):
6 print "New Object created!"
7 def addSomething(cls, x):
8 myList.append(x)
那么如何创建一个在创建对象后可用的空列表?
我还应该补充一点,我写的是 Python 2.7。我的公司喜欢这个版本,所以我坚持使用它。别问了。
谢谢
在Python中,__init__
和__new__
有区别。也就是说,当您的代码命中 __init__
时,它已经是 "constructed"。只有这样,您才能向实例添加新的 "fields",例如 __init__
.
中的 self.myList = []
什么def addSomething(cls, x)
,你可以把它命名为cls
,但实际上它是实例。所以你应该写成self.myList.append()
。
在您的 __init__
函数中 myList
只是局部变量。使用 self.myList
使其成为 class 成员。当然,也可以使用 self 在函数 addSomething() 中访问它:self.myList.append(x)
。您还需要将方法 addSomething 的签名从 addSomething(cls, x)
更改为 addSomething(self, x)
我是一名 Java 努力学习 Python 的程序员,而且几乎肯定会问一个重复的问题。在我的 Python 代码中,我需要创建一个基本上包含列表的对象。当一个对象被实例化时,列表是空的。在代码的后面,我想添加项目:
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()
时,列表没有定义。那是因为一旦对象构造函数完成,在 __init__()
中创建的 myList 就超出了范围吗?当我将 myList = list()
命令移动到 class 定义的顶部时,我收到相同的错误消息:
3 class objWithList:
4 myList = list() # moved list creation here
5 def __init__(self):
6 print "New Object created!"
7 def addSomething(cls, x):
8 myList.append(x)
那么如何创建一个在创建对象后可用的空列表?
我还应该补充一点,我写的是 Python 2.7。我的公司喜欢这个版本,所以我坚持使用它。别问了。
谢谢
在Python中,__init__
和__new__
有区别。也就是说,当您的代码命中 __init__
时,它已经是 "constructed"。只有这样,您才能向实例添加新的 "fields",例如 __init__
.
self.myList = []
什么def addSomething(cls, x)
,你可以把它命名为cls
,但实际上它是实例。所以你应该写成self.myList.append()
。
在您的 __init__
函数中 myList
只是局部变量。使用 self.myList
使其成为 class 成员。当然,也可以使用 self 在函数 addSomething() 中访问它:self.myList.append(x)
。您还需要将方法 addSomething 的签名从 addSomething(cls, x)
更改为 addSomething(self, x)