首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python类中共享变量的正确方法

在Python类中共享变量的正确方法
EN

Stack Overflow用户
提问于 2019-09-03 16:16:59
回答 1查看 61关注 0票数 0

我正在尝试开发一个使用Python的游戏的AI。因此,我有一个类"Game“和一个类"AI”。

我想在AI中使用Game的变量(例如Game的棋盘),但我不确定最好的方法是什么。现在,我发现将信息从游戏传递到AI的唯一方法是每次都将其作为参数。我觉得有一种更好的方法可以与AI共享变量,而不需要每次都进行争论。

我会做一些类似的事情(我知道这段代码不能工作,但仍然如此):

代码语言:javascript
复制
class Game():
    def __init__(self):
        self.board = 1 #It will be an array
        self.ai = AI(self.board)

    def functionThatUpdateTheBoard(self):
        self.board = 2

    def useTheAI(self):
        print(self.board)
        self.ai.getAction()

class AI():
    def __init__(self,board):
        self.board = board
        print(self.board)
    def getAction(self):
        print(self.board)

game = Game()
game.functionThatUpdateTheBoard()
game.useTheAI()

并获得:

代码语言:javascript
复制
1
2
2

感谢您的帮助:)

EN

回答 1

Stack Overflow用户

发布于 2019-09-03 16:42:47

看看是否可以使用观察者模式。

例如,当"board“改变Game类中的值时,创建订阅者并调用。如果一个类需要"board“的更新值,他们可以订阅,这会在"board”的值发生变化时触发。

这样,无论所使用的数据类型是不变的,您都可以非常确定值是否会被更改。

代码语言:javascript
复制
class Game(object):
 def __init__(self):
    self.board = 1
    self.observers = []

 def functionThatUpdateTheBoard(self, new_value): 
    # you can change this to setter ,
    # refer https://www.tutorialspoint.com/What-are-Getters-Setters-methods-for-Python-Class
    self.board = new_value
    for fn in self.observers:
        fn(self.board) # send your board value here.


 def subscribe(self, callback):
    self.observers.append(callback)

class AI(object):
  def game_board_value_changed(self, value):
      print("Printing value in AI class")
      print("Value of 'board' changed in Game class to {}".format(value))


game = Game()
ai = AI()
game.subscribe(ai.game_board_value_changed)
print("*"*50)
modified_value = 10
print("Board value changed in Main to {}".format(modified_value))
game.functionThatUpdateTheBoard(modified_value)
print("*"*50)
modified_value = 100
print("Board value changed in Main to {}".format(modified_value))
game.functionThatUpdateTheBoard(modified_value)
print("*"*50)

**************************************************
Board value changed in Main to 10
Printing value in AI class
Value of 'board' changed in Game class to 10
**************************************************
Board value changed in Main to 100
Printing value in AI class
Value of 'board' changed in Game class to 100
**************************************************
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57767653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档