2

私は次のようなクラスを持っています:

class Hand():
    def __init__(self, hand_a, play_deck, split_count, name): # hand_a for hand actual
        self.hand_a = hand_a  # the actual hand when instance created
        self.play_deck = play_deck  #  need to move this to deck class
        self.split_count = split_count
        self.name = name

別のクラスで、Handのインスタンスを作成します。

class DECK():
    def __init__(self):
        pass

    def deal(self, play_deck):
        dhand = {}
        phand = {}
        for i in range (2):
            play_deck, phand[i] = pick_item(play_deck)
            play_deck, dhand[i] = pick_item(play_deck)

        # creat instance of Hand for player's starting hand
        self.start_hand = Hand(phand, play_deck, 0, "Player 1")

3番目のクラスでは、「start_hand」と呼ばれるHandの最初のインスタンスにアクセスしようとしています。

class Game():
    def __init__(self):
        pass

    def play_game(self):
        self.deck = DECK()
        self.deck.deal(play_deck)
        print "dhand = %r" % start_hand.hand_a

しかし、次のエラーが発生します。

   print "dhand = %r" % start_hand.hand_a
NameError: global name 'start_hand' is not defined

私も試しました:

print "dhand = %r" % self.start_hand.hand_a

しかし、次のエラーが発生します。

    print "dhand = %r" % self.start_hand.hand_a
AttributeError: Game instance has no attribute 'start_hand'

他の方法でクラスインスタンスを作成する必要がありますか、それとも別の方法でアクセスする必要がありますか、またはその両方ですか?それとも、最初からやり直す必要があるほど離れているのでしょうか。

4

4 に答える 4

4

はい、その属性にアクセスできます。あなたが欲しい

self.deck.start_hand.hand_a
# ^ deck object you just created
#         ^Hand object created by the deck constructor/initiator (DECK.__init__)
#                    ^ starting hand attribute of hand object.
于 2012-08-23T13:44:16.360 に答える
1

やってみませんか?

def deal(self, play_deck):
  ...
  return start_hand

それ以外の場合はオブジェクトstart_handのメンバーであるため、次のことを行う必要があります。DECK

self.deck.start_hand

それにアクセスします。

于 2012-08-23T13:44:05.450 に答える
1

あなたstart_handdeckオブジェクトのメンバーです。

print "dhand = %r" % self.deck.start_hand.hand_a
于 2012-08-23T13:45:23.080 に答える
0

他の方法でクラスインスタンスを作成する必要がありますか、それとも別の方法でアクセスする必要がありますか、またはその両方ですか?それとも、最初からやり直す必要があるほど離れているのでしょうか。

あなたの問題は、Python固有の機能以上のオブジェクト指向デザインの1つです。Game、、をどのように相互DECKHand関連付けるかを決定します。多くの場合、適切な解決策は、そのメンバーに委任する囲んでいるクラスにメソッドを作成することです。

これはデバッグコードのように見えるため、具体的な提案をするのは難しいです。しかし、おそらくあなたは置き換えることができます

print "dhand = %r" % start_hand.hand_a

print str(self.deck)

__str__メソッドを追加する限りDeck

def __str__(self):
    return str(self.start_hand)

Hand役に立つために、あなたはクラスのためにもそれを必要とするかもしれません。

未承諾のアドバイス:( hand_a「実際の」)メンバーはHand、かなり紛らわしい比喩を作成します。DECKそれを、またはもっと意味のある何かのプロパティにすることを検討してください。

于 2012-08-23T13:55:54.643 に答える