2016-12-28 3 views
-2

私はoopの概念を学びたいと思っています。私はPythonを選択しました。私が知る限り、self.countとemployee.countはどちらもクラス変数countを呼び出していて、両方とも同じ値を持つ必要があります。ここpythonのself.variable nameとclassname.variableの違い

self.count = self.count + 1 

self.count:ただし、以下のコードのために、私はself.countが1であり、employee.countは0

class employee: 
    count=0 
    def __init__(self,x): 
     self.x=x 
     self.count=self.count+1 
     print ("this method is executed") 
     print (self.count) 
     print (employee.count) 
emp1=employee("John")  
+0

彼らは明らかに同じ変数ではありません。あなたの質問は何ですか?他の '従業員 'オブジェクトを作ろうとしましたか? –

+0

いいえ... self.countとemployee.countは、前に宣言した同じクラス変数の数を参照します。 – vijay

+0

@vijayしかし、インスタンス変数 'self.count'を宣言するまで... – Keiwan

答えて

-2

作成したEmployeeの数をカウントする場合は、すべてのオブジェクト(個別にではなく)に呼び出すメソッドを作成する必要があります。

これを行うには、メソッドを作成し、@staticmethodで彼女を飾る。このメソッドは括弧内にselfを持たないことに注意してください。さらに変数(ここではcount)を作成します。これはすべてのクラスオブジェクトにも呼び出されます(前にはself.なし)。

は、最後に(新しい Employeeは、私たちの変数に1を追加します __init__を作成されるたびに比べて) += 1式で __init__メソッド内で、当社の count変数を置きます。しかし、 countの前に Employee.を追加して、すべてを作成することを覚えておいてください。 Employeeをクラスの母集団として作成してください。

print(emp1.count) 
emp1.status() 
print(Employee.count) 
+2

このコードスニペットがOPの質問 –

+0

にどのように答えているか説明するテキストをあなたの答えに追加してください。私はあなたを助けたと思う –

1

これが原因下の行の幾分微妙であることがわかり右側のself.countと同じものではありません

コードのこの行は既にクラスオブジェクト(すなわちemployeeクラス)に存在する同じ名前の変数をシャドウ名(即ちcount)とselfオブジェクトのインスタンス変数(employeeインスタンス)を作成します。

まず、右側が評価され、実際にはクラスオブジェクトの名前self.countが解決されます。インスタンス属性の有無は、実際には事前にチェックされていますが、インスタンス属性がバインドされていないため、まだ存在しません。次に、右側が評価された後(すなわち、名前self.countが解決され、1が追加される)、評価結果はインスタンス属性に結び付けられる。

両方の変数が共存:

>>> emp1.count 
1 
>>> emp1.__class__.count 
0 

ここで学ぶべき重要なことは、Pythonの属性ルックアッププロセスである:インスタンスの名前空間がチェックされ、その後、クラスの名前空間はをチェックされています。

+0

したがって、右手にside(self.count + 1)では、最初にself.countが検索され、インスタンス変数は見つかりません。それで、クラス変数count(これは初期化されています)の値をとりました。値(0)を見つけた後、値をインクリメントし、それをインスタンス変数に割り当てました。私が間違っている場合は私を修正してください – vijay

+0

正しいです。 – wim

0

emp1インスタンスクラスemployeeです:

class Employee(object): 
    count = 0 

    @staticmethod 
    def status(): 
     print(Employee.count) 

    def __init__(self, x): 
     self.x = x 
     Employee.count += 1 
     print("this method is executed") 
     print("Now, we have got", Employee.count, "Employees") 


emp1 = Employee("John") 

我々は持つ個体数を表示することができます。各インスタンスには、インスタンス変数と呼ばれる独自の変数セットがあります。これらは、クラスのメソッドの内部にself.var = ...として割り当てられたものです。あなたがemp1.varにアクセスしようとすると、このインスタンス変数が割り当てられていない場合

は、Pythonはそれがemployee.varを調べ意味、emp1のクラスに添付var変数を探します。この種の変数はクラス変数と呼ばれ、クラスの先頭にcount=0を定義した方法で定義されます。

あなたの例では、self.count=self.count+1、左側はインスタンスに割り当てられますので、countという名前のインスタンス変数を作成しています。しかし、右側はself.countを参照していますが、これはインスタンス変数としてはまだ存在しません。したがって、employee.countが実際に代わりに使用されます。インスタンス変数とクラス変数の両方に同じ変数名を使用しないと、このような混乱を避けることができます。

関連する問題