2012-02-13 7 views
0

私はクラスについて学んでいます。なぜ、2番目のコードブロックと同じことをするために3番目のコードブロックを使用できないのでしょうか? p1person()に割り当てる必要があり、コードの3番目のブロックで行う方法でperson()を使用するだけではありません。Pythonのクラス、変数の混乱

#class 
class person: 
def asdf(self): 
    self.firstname="" 
    self.lastname="" 
    self.id="" 
    self.email="" 
    self.friends=[] 

#second block of code 

p1 = person() 
p1.firstname="Dave" 
p1.lastname="Johnson" 
p1.id="2345239" 
p1.email="[email protected]" 
print p1.firstname 

#third block of code 

person().firstname="Dave" 
person().lastname="Johnson" 
person().id="2345239" 
person().email="[email protected]" 
print person().firstname 
+1

私はあなたが学んでいるチュートリアルが何であれ、それを再読み込みする必要があると思います。 –

答えて

5

2番目のブロックでは、同じインスタンスのプロパティを変更します。

p1 = person()    # create new instance 
p1.firstname="Dave"   # change its first name 
p1.lastname="Johnson"  # change its last name 
# ... 
print p1.firstname   # access its firstname 

第3ブロックでは、各行に新しいインスタンスを作成します。

person().firstname="Dave"  # create new instance and change its firstname 
person().lastname="Johnson" # create new instance and change its lastname 
# ... 
print person().firstname  # create new instance and access its firstname 

、より正確であるとあなたはまだfirstname属性のみ機能asdfで宣言されているので、宣言、または、中にはなかったattirbuteにアクセスしようとして、問題は、最後の行で発生しますラインここp1.firstname="Dave"

における第二のブロックは、単純な例です:コードの3番目のブロックにおいて

>>> class A: 
...  def AA(self): 
...   self.a = 1 
... 
>>> a = A() 
>>> a.a 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: A instance has no attribute 'a' 
>>> a.a = 1 
>>> a.a 
1 
+0

したがって、2番目のコードブロックでは、p1は最初の行で新しいインスタンスになり、その後の行で変更されます。しかし、3番目のブロックでは、すべての行ごとに新しいインスタンスを作成し、それぞれのインスタンスをfirstnameやlastnameなどの変更で変更しています。私は 'インスタンスには属性がありません 'というエラーメッセージが表示されます。したがって、' person() 'のインスタンスとしてp1を作成すると、pythonにはfirstnameなどの属性があることがわかります。私は属性が正確であるかどうか分かりません。 – ZCJ

+0

属性は割り当てているものです。 'p1'が' person'の場合、 'p1.firstname'は' person'の 'firstname'属性です。あなたは "p1をperson()のインスタンスとして作成しない"; 'person()'が作成した 'person'クラスのインスタンスを変数' p1'に代入します。チェックしている 'firstname'の' person'があなたが割り当てた 'firstname'と同じ' person'ではないので、3番目のブロックからエラーメッセージを受け取ります。 'p1'の' firstname'を設定し、後で 'p1'の' firstname'をチェックすると、それは明らかに両方の場所で同じ 'person'です。 –

3

person()への各呼び出しは、person Cの新しいインスタンスを作成しますラス。次に、コードはそのオブジェクトの属性の値を設定し、オブジェクトに変数が格納されていないためオブジェクト全体を破棄します。

1

FYIのPythonスタイルは、クラスのラクダケースを使用することです。これは問題の一部です。最初のキャップは、クラスの構築をメソッド呼び出しと区別するのに役立ちます。

インスタンスを作る
class Person(object): 
    def asdf(self): 
     self.firstname="" 
     self.lastname="" 
     self.id="" 
     self.email="" 
     self.friends=[] 

:クラスを定義

p = Person() 

関数呼び出しのようなクラス名を使用するには、プロトタイプとしてクラスを使用して、インスタンスを作成します。 2番目のブロックでは、インスタンスを作成し、その属性を変更しています。

3つ目のブロックでは、personという4つの新しいインスタンスを作成し、それらのインスタンスに1つの属性を設定し、それらをスローします(何も割り当てられていないため)。

クラスの過去記事を読む本当に価値がある: http://docs.python.org/tutorial/classes.html

あなたが必要としない基本的な実装のかなりの量がありますが、クラス、インスタンス、および属性に関するいくつかの重要な詳細情報もあります。

+0

クール、リンクありがとう。私はちょうどこのようなことを始めています。大文字に関する興味深い注記。それは必要ではないように見えるが、私は後で "人"が何を指しているかのヒントとしてそれをしないことでエラーを作ることができます。 – ZCJ