python - 一个类的多个实例被覆盖

标签 python oop

class Player:
    hand = [None]*10
    field = [None]*10
    deck = []

    def __init__(self, deck):
        self.deck = deck

    def setHand(self, hand):
        for i in range(0, len(hand)):
            self.hand[i] = hand[i]

    def setField(self, field):
        for i in range(0, len(field)):
            self.field[i] = field[i]

card1 = Card(1, 0)
card2 = Card(2, 0)
card3 = Card(3, 0)
h = [card1, card2, card3]
f = [card1, card2, card3]
f2 = [card1, card2]

cpu1 = Player(f2)
cpu1.setField(f2)
user1 = Player(h)
user1.setHand(h)
user1.setField(f2)

这里我的问题是 setField 函数覆盖了 Player 类的两个实例,我不知道为什么。我看过类似问题的其他答案,但我还没有看到我做错了什么。

最佳答案

这是因为您引用的是类属性而不是实例属性。从您发布的代码来看,您似乎有一些 Java 背景,您可以在类的主体中指定一些变量,然后在各种构造函数中引用它们。

但在 Python 中情况有所不同。无论您在类的范围内声明什么,都将在该类的实例之间共享(特别是如果它是可变数据结构 - 例如列表)。

如果您希望拥有仅属于实例的对象,则需要将它们分配给 __init__ 内的“self”(当然,不需要将它们指定为类属性):

    def __init__(self, deck):
        self.deck = deck
        self.hand = []
        self.field = []

关于python - 一个类的多个实例被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60131074/

相关文章:

python - 控制缓存 View 的缓存键的命名

python 子进程意外退出,退出代码为-9

Python Enum 防止无效的属性赋值

python - 使用 map 功能

python - 检索 Typing.List[X] 类型

c# - 使用字符串选择对象属性

python - 如何在 Python 中创建新的未知或动态/扩展对象

Java:是否有一种数据结构可以像多重映射一样工作,但接受重复的键?

javascript - 在 Javascript 中,每个函数都可以被视为一个类的构造函数吗?

java - 相似但不同的多个子类