0

私はPythonを初めて使用しますが、それは本当に私を混乱させました。

のようなものを書きたい

class line :
    points = []

    def add(self, point) :
        self.points.append(point)

line1 = line()
line2 = line()
line1.add("Some point")
print line2.points

出力:['Some point']

結果は、同じリストを参照しているようになります。
しかし、クラスメンバーではなくオブジェクトメンバーが必要です。

そして、pointsがint、または他の単純なタイプであれば、問題なく動作するかどうかを試しました。

その上、私が書くかどうか知っています

def __init__(self) :
    self.points = []

それも機能しますが、デフォルトで同じリストを指している理由がわかりません。

ps。私はinitを書くことがうまくいくことを知っています。

class line :
    name = "abc"

    def changename(self, name) :
        self.name = name

line1 = line()
line2 = line()
line1.changename(123)
print line2.name

しかし、上記のコードは出力します"abc"

ですから、なぜ同じ種類の宣言がタイプによって異なるのか理解できません。

4

3 に答える 3

2

最初の構文:

class line :
    points = []

クラス属性を作成pointsします。したがって、クラスのすべてのインスタンス間で共有されます。

属性がクラスに属していることを確認するには、次のようにする必要があります。

class line(object) :
    def __init__(self):
        self.points = []

つまり、__init__新しいインスタンスが作成されたときに、でのみ属性を作成します。

于 2012-08-29T11:04:19.597 に答える
2

この場合は

class line :
    points = []

pointsクラスのメンバーです。それはクラスに属し、とline1line2同じクラスpointsあるため、同じリストです。

だからあなたは正しく使用しています

def __init__(self) :
    self.points = []

代わりに、クラスではなく、インスタンスに関連付けられたインスタンスメンバーを作成します。

あなたの編集に答えるには

あなたが書く場合:

def changename(self, name) :
    self.name = name

クラスメンバーをオーバーライドし、を使用して新しいインスタンスメンバーを作成しますself.name = name

最初の例に戻ると、次のようになります。

def add(self, point) :
    self.points = self.points + [point]
于 2012-08-29T11:04:23.040 に答える
1

他の人がすでに説明しているように、そしてあなたがすでに理解しているように、以下はすべてのインスタンスによって共有されるクラス属性を作成します:

class line:
    points = []

コードでこの属性を参照すると、Pythonは現在のスコープを見つけようとし、それを囲むスコープに従います。したがって、を呼び出すとself.points.append()、実際にpoints クラス属性が変更されます。

コードでに割り当てるときは、新しいインスタンス属性self.pointsを定義しています。したがって、2番目の例では、が文字列の場合、関数は呼び出されたときに実際に新しいインスタンス属性を作成します。 points pointschangename

次のことを試すことができます。

print line.name  # prints the class attribute
print line1.name # prints the class attribute
print line2.name # prints the instance attribute

changenameクラス属性は変更されないまま、呼び出しによって新しいインスタンス属性が作成されたことがわかります。changename呼び出されたことはないのでline1、その参照はクラス属性nameに解決されます。line

于 2012-08-29T11:20:20.460 に答える