2016-05-25 11 views
1

私は今、しばらくの間、この問題に問題がありましたし、次は、問題の例である:他のクラスのインスタンスのプロパティにアクセスできないのはなぜですか?

class Player(object): 
    def __init__(self): 
     self.weapon = "rifle" 
     self.rifle_test = Rifle(self) 
     self.dictionary = {} 
     self.dictionary["rifle"] = self.rifle_test 

    def check(self): 
     print(self.weapon) 
     print(self.dictionary[self.weapon].ammo) 

class Rifle(object): 
    def __init__(self, player): 
     self.ammo = 10 
     self.player = player 
     self.player.check() 

player_test = Player() 

私はプレイヤー(「player_test」)とライフルを持っている(「rifle_test」)。 Rifle()内でcheck()を呼び出すと、コンソールに何も表示されません。私は、2つのクラスを分離し、player_testなどでrifle_testを持たないものを動かしてみました。主な問題は次のとおりです。別のインスタンスから特定のインスタンスの関数を実行すると、関数は実行されますが、それはそれを運ぶインスタンスから実行された。言い換えると、私がRifle()からcheck()を実行すると、player_testから実行する場合とは異なります。関数を、player_testから実行するのと同じ方法で実行する方法はありますか?ありがとう。

+0

ハムスの答えに加えて、「ライフル」は 'player'パラメータを必要としますか? – 101

答えて

6

相互に排他的な依存関係があります。 、あなたは新しいプレーヤーを作成

player_test = Player() 

まず新しいプレーヤーを作成すると、そのクラスに__init__メソッドを呼び出すことを意味するので、我々はそれを行う...

:あなたがあなたのプログラムを実行するときに何が起こるかをよく見ます
class Player(object): 
    def __init__(self: 
     self.weapon = "rifle" 
     self.rifle_test = Rifle(self) 

ああ!しかし途中で、私たちは新しいライフルを作ります。

class Rifle(object): 
    def __init__(self, player): 
     self.ammo = 10 
     self.player = player 
     self.player.check() 

さてさて、私たちのライフルの作成、そして我々はself.player.check()を呼び出す:

def check(self): 
    print(self.weapon) 
    print(self.dictionary[self.weapon].ammo) 

しかし、待って!最初にプレイヤーの作成を完了したことはありません。この時点では、self.weaponが定義されていますが、実際にはまだself.dictionaryは作成されていません。

あなたがそこにself.dictionaryを初期化しているに依存してきたが、あなたは持っているあなたのself.dictionaryが順番にcheckに依存定義さself.rifle_test、というそこに依存します。checkの定義

これは循環依存であり、動作しません。あなたは再設計する必要があります。ライバルの__init__からcheck()へのコールを削除することをお勧めします。

+0

*最初にプレイヤーを作成したことはありません* - あなたはそれを釘付けにしました! – felipsmartins

+0

私のファイルでは、非常に似たようなシナリオがありますが、私のライフルの '__init__'関数にcheck()はありません。この場合でも、主に循環依存のためにエラーが発生します。私は様々な再編成方法を試しましたが、何もうまくいかず、どんな試みも通常、ひどく乱雑になりました。私はPythonの初心者です。どのように私はこれを再編成することができますか? – blackhole

関連する問題