2016-05-03 14 views
-1
class Dog: 
    def __init__(self, ap1) 
    self.name = ap1 
    self.tricks = [] 
    def.addTrick(self, ap1) 
    self.tricks.append(ap1) 

上記のように、私は犬のインスタンスを生成するクラスを持っています。保存されている変数を使わずにクラスインスタンスを参照することはできますか?

curDog=Dog("Seymour") 
curDog.addTrick("Wait Forever") 
print("curDog is " + curDog.name) 
print(curDog.name + " knows " + str(curDog.tricks)) 
print("") 

curDog=Dog("Brian") 
curDog.addTrick("Psuedo Intellectual Debate") 
print("curDog is " + curDog.name) 
print(curDog.name + " knows " + str(curDog.tricks)) 
print("") 

そしてここで上記の私はシリアルに、同じ変数curDog(現在の犬)を占め、2つのインスタンス、Dog('Seymour')Dog('Brian')を持っています。出力は次のようになります。

>>> main() 
curDog is Seymour 
Seymour knows ['Wait Forever'] 

curDog is Brian 
Brian knows ['Pseudo Intellectual Debate'] 

>>> 

curDogを使用してブライアンを保存すると、もはやシーモアは参照されなくなることは明らかです。しかし、この時点で私はシーモアに何が起こったのだろうかと思います。彼はまだ環境のエーテルの中にいて、単に可変リンクから切り離されていますか?または彼は完全にBrianのための部屋を作るために絶滅したのですか?

前者の場合、どうすれば彼と彼のトリックリストにアクセスできますか?

投稿の原点以上に、curDogを使わずにブライアンを参照することは可能ですか?私はprint("Brian".tricks)print(Dog('Brian').tricks)のようなものを試しましたが、うまくいかなかったときにはそれほど驚きませんでした。

これを行う方法はありますか?自分自身でこれに答えるのに役立つクラスインスタンスを理解するためのより良い方法がありますか?

+1

オブジェクトへの参照が残っていなければ、ガベージコレクションのために解放されます - 将来、ある特定の時点で、それは他のものでメモリに上書きされます。複数のインスタンスへのアクセスを維持する必要がある場合は、それらを辞書またはリストに入れます。 – jonrsharpe

+1

あなたが探しているフレーズは "ガベージコレクション"です。それについて多くのことが書かれています。例:http://arctrix.com/nas/python/gc/ –

答えて

1

Seymourがガベージコレクションされるタイミングを伝えるコードを追加することで、これを解決できます。

curDog is Seymour 
Seymour knows ['Wait Forever'] 

*** deleting Seymour *** 
curDog is Brian 
Brian knows ['Psuedo Intellectual Debate'] 

*** deleting Brian *** 

それはプログラムがこのように動作している保証がないことは注目に値します。このほかに、コードを実行する

class Dog: 
    # ... 
    def __del__(self): 
    print('*** deleting {} ***'.format(self.name)) 

が起こる正確に何を示しています。 Pythonインタプリタには、プログラムが終了したときやメモリが必要なときなど、後の時点までSeymourを削除するのを待つオプションがあります。すぐにガベージコレクションされるオブジェクトに依存するPythonプログラムを書かないでください。しかし、実際には待つことに利点はないので、インタプリタはオブジェクトがもはや参照されなくなったら削除します。

もちろん、オブジェクトへの複数の参照があります。つまり、同じオブジェクトを複数の変数に格納することができます。新しい変数curDog2を作成してSeymourを格納すると、curDogをBrianに再割り当てすると、Seymourは依然としてcurDog2によって参照されます。このため、ガベージコレクションを行わない理由が通訳者に与えられます。オブジェクトは、がない場合、の参照が残っている場合にのみ、この方法で消えます。

しかし、インタープリタは、独自のカスタムオブジェクトへの参照を作成しません。だから、あなたがそれを保存した変数や何かを通らなければ、オブジェクトにアクセスする方法はありません。

+0

完璧な答えです。ありがとうございました。 – Musixauce3000

関連する問題