【问题标题】:All class objects become one when calling a function upon them python [duplicate]当对它们调用函数时,所有类对象都变成一个python [重复]
【发布时间】:2017-04-04 15:13:23
【问题描述】:

在实验过程中,我遇到了一个非常奇怪的问题,让我很困惑。通过遍历一个范围创建多个类对象后,我从另一个类中调用了一个函数,该函数会将 1 个字符串附加到主类对象。在查看了所有对象的列表后,我发现它们都是一样的,尽管它们应该不同,而且每个类不只有一个字符串,但字符串的数量与类对象本身。

class Stack():

    cards = []
    setUp = False

    def set_up(self):

        cardTypes = ["A", "B", "C", "D"]

        for cardType in cardTypes:
            for x in range(3):
                self.cards.append(cardType)

        self.setUp = True


    def deal(self, player, amount):

        if self.setUp:            
            for x in range(amount):
                card = self.cards[0]
                self.cards.remove(card)
                player.cards.append(card)

        else:
            self.set_up()
            self.deal(player, amount)


class Player():

    cards = []


class Game():

    def start(self):

        stack = Stack()

        players = [Player() for player in range(int(input("How many players?")))]

        for player in players:
            stack.deal(player, 1)

        for player in players:
            print(player.cards)
            #all players have the same numbers of cards (the amount of players = number of cards)
            #when all players should only have 1 card each since I put 1 in stack.deal
            #it's also as if all players become one when I call that function.

我使用Game().start() 运行代码。

【问题讨论】:

  • 不告诉我们你的缩进,你能解决它吗?我会自己做,但我不确定课程本身。它们是在父类中,还是分开的?
  • 你的缩进还在拧。我猜“它们都一样”是指“它们都具有相同的cards 属性”。这是可以预料的,因为cards 是一个类属性。也许你希望它是一个实例属性。
  • @Goyo 是的,它们都应该具有相同的类属性“cards”,尽管属性“cards”中应该只有一个元素 - “A”。
  • 没有。你有 n 个玩家,你加了 n 张牌。
  • @ChrisCroissant 该函数不保留任何内容,并且一次只处理一个对象。但cards 属性始终相同。你知道“类属性”是什么意思吗?你似乎有点混淆类和实例。

标签: python python-3.x function class


【解决方案1】:

对于从 Java 或 C++ 进入 Python 的人来说,这是一个常见错误: 在类主体中声明的属性实际上是 class 属性,并且对于该类的所有实例都是可见的同一个对象。

要为您的类的每个实例创建新的独立属性,您必须在 __init__ 方法中对它们进行属性:

class Stack():
   def __init__(self):
        self.setup = False
        self.cards = []
   ...

(此外,还有另一个“Java 主义”:并非所有代码都需要在 Python 的方法中运行 - 所以,在游戏类中使用 start 方法是没有意义的 - 如果有的话是其中的一个方法,只需取消“游戏”类并将该代码移动到一个函数(def game(...):)并调用它即可开始)。

【讨论】:

    猜你喜欢
    • 2013-12-09
    • 2014-09-07
    • 1970-01-01
    • 2012-08-14
    • 2018-12-25
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    相关资源
    最近更新 更多