Python Fix依赖周期

时间:2019-02-08 22:15:34

标签: python

我正在使用python开发游戏。

游戏中的AI使用玩家拥有的变量,反之亦然。

例如:

class Player():
    def __init__(self, canvas...):
        self.id = canvas.create_rectangle(...)
        ...
    def touching_AI(self):
        aipos = canvas.coords(AI object)
        pos = canvas.coords(self.id)
        ...

    #the function above checks if the player is touching the AI if it 
    #is, then call other functions

this = player(canvas...)

class AI():
   def __init__(self, canvas...):
       self.id = canvas.create_rectangle(...)
   def chase_player(self):
       playerpos = canvas.coords(this.id)
       pos = canvas.coords(self.id)
       ...
       # a lot of code that isn't important

很明显,Python说没有定义播放器类中的AI对象。两个类都依赖于另一个类来工作。但是,尚未定义一个,因此,如果我将一个放在另一个之前,则会返回错误。尽管可能仅针对这两个功能有一种解决方法,但我没有提到更多功能。

总而言之,在创建对象之前(甚至制作更多文件),是否有一种方法(pythonic或非pythonic)使用和/或定义对象?

3 个答案:

答案 0 :(得分:2)

你不

代替使用参数

class Player():
    def __init__(self, canvas...):
        self.id = canvas.create_rectangle(...)
        ...
    def touching(self,other):
        aipos = canvas.coords(other.object)
        pos = canvas.coords(self.id)
        ...

    #the function above checks if the player is touching the AI if it 
    #is, then call other functions

class AI():
   def __init__(self, canvas...):
       self.id = canvas.create_rectangle(...)
   def chase(self,player):
       playerpos = canvas.coords(player.id)
       pos = canvas.coords(self.id)

然后

player = Player(canvas...)
ai  = AI(...)
ai.chase(player)
player.touching(ai)

但更好的是定义定义您的接口的基础对象类型

class BaseGameOb:
     position = [0,0]
     def distance(self,other):
         return distance(self.position,other.position)

class BaseGameMob(BaseGameOb):
     def chase(self,something):
         self.target = something
     def touching(self,other):
         return True or False

那么你所有的东西都继承自这个

class Player(BaseGameMob):
      ... things specific to Player

class AI(BaseGameMob):
      ... things specific to AI

class Rat(AI):
    ... things specific to a Rat type AI

答案 1 :(得分:1)

您没有依赖性周期问题。但是,您有以下问题,

  1. 您正在尝试使用AI对象,但是没有在任何地方创建该对象。它需要看起来像

    foo = AI() #creating the object bar(foo) #using the object

  2. canvas.coords(AI object)周围的语法错误。

    调用函数的方法是foo(obj),不带类型。

    定义函数时,您可以选择提及def foo(bar : 'AI'):

  3. 之类的类型

您可以相互依赖类的证明,https://pyfiddle.io/fiddle/b75f2de0-2956-472d-abcf-75a627e77204/

答案 2 :(得分:0)

您可以初始化一个而不指定类型,然后再分配它。 Python假装每个人都是大人。.

例如:

div.interesting {
    border: 5px 0px 5px 5px solid #11CBD7;
    padding: 5% 2%;
}