我对python比较陌生。让我怀疑一个例子:
我创建了一个名为" person"
的类对象class person:
name = ""
age = ""
phones = []
def add_phone(self, number):
self.phones.append(number)
让我们准备一些数据,以便日后使用:
names = ["jhon", "tony", "mike", "peter"]
ages = [34, 36, 23, 75]
phones = [7676, 7677, 7678, 7679]
让我们进入for循环:
for i in range(0,4):
new_person = person()
据我所知,每次执行前一行时,都会创建一个新的对象人员并调用new_person,并且应该销毁上一次迭代中变量new_person中的任何对象。然而事实并非如此:
new_person.name = names[i]
new_person.age = ages[i]
new_person.add_phone(phones[i])
print "i= " + str(i)
print "name= "+ new_person.name
print "age= "+ str(new_person.age)
print "phones:"
print new_person.phones
new_person.phones
包含我们在之前的迭代中添加的手机。有人看到我错过了吗?这是否意味着对象类" person"表现得像一个单身人士?
答案 0 :(得分:3)
正如您所期望的那样,对象正在被创建和销毁。问题是self.phones
属于类而不是实例,因此由person
的所有实例共享。
要修复,请更改您的课程:
class person(object):
def __init__(self):
self.name = ""
self.age = ""
self.phones = []
def add_phone(self, number):
self.phones.append(number)
答案 1 :(得分:2)
您正在定义一组几乎肯定是实例级别的类级别属性。我想你想要的是:
class person:
def __init__(self):
self.name = ""
self.age = ""
self.phones = []
def add_phone(self, number):
self.phones.append(number)
在Python中处理实例化的方式是初始化程序__init__()
(与其他语言中的构造函数类似但不相同)创建实例属性。在Python中,将未初始化的属性设置为None
而不是空字符串可能更常见。此外,在初始化程序中包含常用属性是很常见的:
def __init__(self, name = None, age = None, phones = None):
self.name = name
self.age = age
if phones = None:
self.phones = []
else:
self.phones = phones
答案 2 :(得分:-1)
要按预期工作,您需要将phones
定义为实例属性。
class person:
name = ""
age = ""
def __init__(self):
self.phones = []
def add_phone(self, number):
self.phones.append(number)
在您的示例中,您将手机附加到类属性,该属性为所有实例“共享”(比如说)。