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以前の繰り返しで追加した電話が含まれています。誰かが私が欠けているものを見ていますか? これは、オブジェクト クラス「person」がシングルトンのように振る舞うということですか?

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__()(他の言語のコンストラクターと似ていますが同じではありません) がインスタンス属性を作成することです。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
于 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 に答える