1

我对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()

据我了解,每次执行前一行时,都会创建一个新对象 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包含我们在之前的迭代中添加的电话。有人看到我错过了什么吗?这是否意味着对象类“人”的行为就像一个单身人士?

4

3 回答 3

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)
于 2012-12-17T21:35:34.200 回答
2

您正在定义一堆几乎可以肯定是实例级别的类级别属性。我想你想要的是:

class person:

    def __init__(self):

        self.name = ""
        self.age = ""
        self.phones = []

    def add_phone(self, number):

        self.phones.append(number)

在 Python 中处理实例化的方式是初始化器__init__()(类似于但不同于其他语言中的构造器)创建实例属性。None在 Python 中,将未初始化的属性设置为而不是空字符串可能更常见。此外,在初始化程序中包含常用属性是很常见的:

    def __init__(self, name = None, age = None, phones = None):

        self.name = name
        self.age = age
        if phones = None:
            self.phones = []
        else:
            self.phones = phones
于 2012-12-17T21:35:49.587 回答
-1

要按预期工作,您需要定义phones为实例属性。

class person:
    name = ""
    age = ""
    def __init__(self):
        self.phones = []
    def add_phone(self, number):
        self.phones.append(number)

在您的示例中,您将电话附加到类属性,该属性对于所有实例都是“共享的”(也就是说)。

于 2012-12-17T21:35:27.543 回答