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")

在第三堂课中,我试图访问我的第一个 Hand 实例,称为“start_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_handDECK对象的成员,因此您必须:

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

我是否必须以其他方式创建类实例,还是必须以不同的方式访问它或两者兼而有之?还是我离得太远了,我应该重新开始?

您的问题是 OO 设计之一,而不是特定于 python 的功能。决定你想要如何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创建了一个非常令人困惑的隐喻。考虑将其作为 the 的属性DECK或其他可能更有意义的属性。

于 2012-08-23T13:55:54.643 回答