对一个对象做某事对同一个类的所有对象都是一样的吗?

时间:2015-09-17 21:23:24

标签: python class oop variables object

我只是刚刚开始认真地在Python中涉猎,所以这可能有一个非常简单的答案,但目前我只是傻眼了。以下是我的代码的要点:

class deck:
    cards = [
        'ace of spades',
        'two of spades',
        'three of spades',
    ] #...and so on


    def deal(self, hand): #takes the last card in the deck and transfers it to the supplied hand
        hand.add_card(self.cards.pop(-1))

class hand:
    cards = []

    def add_card(self, card):
        self.cards.append(card)

foobar = deck()
hand1 = hand()
hand2 = hand()
foobar.deal(hand1)
print(hand2.cards) #['three of spades']

我想要的是能够通过拨打deck.deal(hand)将牌从牌组交给牌手。

好消息是,上面的代码确实从foobar获取了一张卡片并将其添加到hand1。坏消息是......它还将其添加到hand2

这可能是我从编程中遇到的最困惑的事情。 hand1hand2非常明显地是两个不同的变量!那么为什么单手交易卡也会将同一张卡交给另一只手呢?我的意思是,甚至提到hand2的唯一时间就是它被创建的时间。

2 个答案:

答案 0 :(得分:2)

您的问题是您在cards = []课程的正文中写了hand。这使得它成为类变量,它在类的所有实例之间共享(在您的情况下,hand1hand2是两个不同的实例 hand类的。如果任何实例更改它,它将在所有其他实例中自动反映。

要在仅属于单个实例的类中创建实例变量,您应该在hand类中创建一个构造函数,该类初始化self.cards

def __init__(self):
    self.cards = []

在Python课程的Object-Oriented Programming(小节"实例变量")和Class and Instance Variables章节中提供了对实例和类变量的可访问介绍。有关类和实例变量的官方文档分别在Python文档的9.3.29.3.3部分中。

答案 1 :(得分:1)

您需要创建一个实例变量,而不是类变量:

class hand:
    def __init__(self):
        self.cards = []