2

重複の可能性:
Python 継承で属性参照がこのように動作するのはなぜですか?
Python: 派生クラスは、同じメモリ位置にある基底クラスの辞書にアクセスします

コードを見てみましょう:

class parent:
    book = {'one':1, 'two':2}

class child(parent):
    pass

first = child()
second = child()

print first.book
print second.book

second.book['one'] = 3

print first.book
print second.book

このオブジェクトを実行すると、「最初に」辞書が編集されます! なんてこと?「最初」と「2番目」は「子」クラスの別々のインスタンスだと思いました。ここで何が起きてるの?2 番目に編集したものが最初に影響するのはなぜですか?

各子クラスで本を再作成することでこれを「修正」できますが、それは正しい方法ではありません。クラスを本来の使用方法で利用したいと考えています。

私は何を間違っていますか?

ところで、私の主な言語は cpp なので、cpp を python などと混同しているのかもしれません...

どんな助けでも大歓迎です!

4

3 に答える 3

2

book をクラスの親の静的変数として宣言しています。これは、モジュールがロードされるときに変数が初期化されることを意味します。

クラスの作成時に初期化する必要があるため、各インスタンスの構築時に自動的に呼び出されるメソッドであるinitメソッドが必要です。

親initを手動で呼び出す必要もあります。

class parent:
    def __init__(self):
        self.book = {'one':1, 'two':2}

class child(parent):
    def __init__(self):
        parent.__init__(self)

first = child()
second = child()

print first.book
print second.book

second.book['one'] = 3

print first.book
print second.book
于 2012-08-26T04:48:40.970 に答える
2

クラスの各インスタンスに book という名前の独自の辞書を与えるには、self表記法を使用する必要があります。

class parent:
    def __init__(self):
        self.book = {'one':1, 'two':2}

class child(parent):
    pass

first = child()
second = child()

print first.book
print second.book

second.book['one'] = 3

print first.book
print second.book

出力:

>>> 
{'two': 2, 'one': 1}
{'two': 2, 'one': 1}
{'two': 2, 'one': 1}
{'two': 2, 'one': 3}
>>> 
于 2012-08-26T04:48:45.760 に答える
1

Python は、クラス定義の処理時にこれらのクラス スコープ変数を初期化し、同じオブジェクトが全体で使用されます。

ディクショナリを各インスタンスに一意にする場合は、オブジェクトの構築中に を実装して割り当てます__init__

于 2012-08-26T04:45:21.330 に答える