python:访问类中的过去值

时间:2018-07-11 22:54:20

标签: python

我正在尝试创建一个简单的游戏,该游戏最好玩五局,而B队每轮都有60%的获胜机会。此外,我想模拟每个游戏玩X次。

理想情况下,运行所有模拟后,我将能够访问每次模拟中发生的事情。例如。谁赢得了第一轮,谁赢得了第二轮,等等。

我的想法是,我可以将来自类的所有数据附加到列表中,然后再访问每个数据。但是,除非您附加实际值,否则它不起作用。

下面是代码的简化示例:

class Game(object):

    def add_values(self):
        if random.random() > 0.6:
            Team.scoreA+=1
        else:
            Team.scoreB+=1

    def check_if_end(self):
        end = 0
        if max(Team.scoreA,Team.scoreB) == 3: end = 1
        return end

import random

class Team(object):

    def oriscore(self):
        Team.scoreA = 0
        Team.scoreB = 0

objdata = []
antsim = 200
for a in range(antsim):
    Team.oriscore(1)

    for i in range(5):
        Game.add_values(1)
        end = Game.check_if_end(1)
        if end == 1:
            objdata.append(Team)
            break

for i in objdata:
    print(i.scoreA,i.scoreB)

打印以下值将仅显示最后一次模拟的结果。而我想要每次模拟的结果。

在这个特定的游戏中,我可以更改它,以便同时添加scoreA和scoreB,但这似乎并不那么可扩展。所以我想知道是否有更有效的方法。

谢谢。

1 个答案:

答案 0 :(得分:0)

您的根本问题是,您没有创建任何实例。程序中唯一的对象(除了几个数字)是类本身。因此,除了Test类对象之外,您没有什么要存储的东西了,您会一遍又一遍地追加它,因此最终得到同一类对象的列表(您不断进行变异)200次连续

您要做的是创建200个实例 Team实例,并将这些属性存储在这些实例上,然后您可以在其中包含200个 separate 对象列表。

首先,您必须使Team成为一个在其实例上存储值的类:

class Team(object):
    def __init__(self):
        self.scoreA = 0
        self.scoreB = 0

现在,您必须对Game执行相同的操作。而且,由于每个Game必须与一个Team一起使用,因此您需要给它一个:

class Game(object):
    def __init__(self, team):
        self.team = team

    def add_values(self):
        if random.random() > 0.6:
            self.team.scoreA += 1
        else:
            self.team.scoreB += 1

    def check_if_end(self):
        end = 0
        if max(self.team.scoreA, self.team.scoreB) == 3: end = 1
        return end

现在,您的循环可以创建单独的实例。然后,您可以在这些实例上调用方法,而不必在类上调用它们并将1作为伪造的self传递:

objdata = []
antsim = 200
for a in range(antsim):
    team = Team()   

    for i in range(5):
        game = Game(team)
        game.add_values()
        end = game.check_if_end()
        if end == 1:
            objdata.append(team)
            break

现在,您有200个不同的Team实例的列表,而不是200个对team类对象的引用的列表:

for team in objdata:
    print(team.scoreA, team.scoreB)