【问题标题】:Doing something to one object does the same to all objects of the same class?对一个对象做某事对同一类的所有对象做同样的事情吗?
【发布时间】:2015-12-14 21:43:27
【问题描述】:

我才刚刚开始真正涉足 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。

这可能是我在编程中遇到的最困惑的事情。 hand1 和 hand2 很明显是两个不同的变量!那么为什么给一只手发牌也会给另一只手发同一张牌呢?我的意思是,唯一提到hand2 的时间是它被创建的时候。

【问题讨论】:

  • python class attribute的可能重复
  • 其实更多的是stackoverflow.com/questions/207000/…的复制品。它可能会帮助您查看链接问题的答案,Cal。
  • 首先你需要了解类和对象之间的区别。您正在使用类,就好像它们是对象一样。您需要实例化类并为甲板和手创建对象。 Pythonwise,cards,因为它们出现在两个类中,是类属性,而不是实例属性

标签: python class oop variables object


【解决方案1】:

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

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

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

在 Python 课程的Object-Oriented Programming(“实例变量”小节)和Class and Instance Variables 章节中提供了对实例和类变量的易于理解的介绍。关于类和实例变量的官方文档分别位于 Python 文档的 9.3.2 和 9.3.3 部分。

【讨论】:

  • 这是因为body中的代码是在类定义时执行的,而不是在对象实例化时执行的,所以对象只创​​建一次(然后在所有实例之间共享)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多