2016-04-23 3 views
0

PythonでOOPパラダイムを「再生」しているときに、私は誤解を感じました。 のは、いくつかの小さな例を見てみましょう:最初の印刷例のID番号は、両方のインスタンスで同じである理由Pythonで変数を代入することなくクラスインスタンスを作成して比較する

class A(object): 
    pass 

print id(A()), id(A()) # 139865221604432 139865221604432 
print id(A()) == id(A()) # True 
print A() is A()   # False 
a1 = A()     
print id(a1)    # 139865221604432 
a2 = A() 
print id(a2)    # 139865220638096 

そこで質問です。 A() is A()を見ると、すべてが「ok」であり、結果はFalseであることがわかります。わかりませんが、ガベージコレクションを扱うことはできますか?

もう一つの例:

class B(object): 

    def __init__(self): 
     self.msg = 'Some default message' 
     print id(self) 

    def do_smth(self, msg): 
     self.msg = msg 

    def get_msg(self): 
     return self.msg 

はその後、我々は2例があります。

第一:

B().do_smth(B().get_msg() + ' add') 

第二

b = B() 
b.do_smth(b.get_msg() + ' add') 
私の知る限り、我々は最初のもののように2つのインスタンスを作成しないため、2番目のアプローチは、はるかに望ましい理解し

。しかし、私たちが第1のアプローチを満たすことができる興味深いケースはありますか? id機能用のPython documentationから

答えて

0

...非重複寿命と

2つのオブジェクトが同じid()値を有していてもよいです。あなたは

print id(A()), id(A()) 

を行うと最初のオブジェクトがスコープ外になったので、それがオブジェクトごとに同じIDを印刷し

。作成したAの各インスタンスは、idの呼び出しが必要な場合に限り存在します。変数が範囲外になると、変数を収集してそのIDを再利用することができます。オブジェクトを変数に割り当てるとすぐに、変数が有効範​​囲外になるまで再利用することはできません。

2番目の例では、2番目の形式が最初の形式より優先される理由は、通常、オブジェクトインスタンスの状態が異なることです。あなたの最初のフォームは実際には、Bのすべてのインスタンスが同じ値を持っているため、実際には機能します。これはクラスにとって珍しいプロパティです。しかし、オブジェクトにデータを要求し、そのデータをメソッド引数としてオブジェクトに返すのは、通常、オブジェクト指向の習慣ではないことに注意することは重要です。

関連する問題