我如何从一个类访问变量并在另一个类中使用它?

时间:2019-12-04 19:41:34

标签: python pygame

这是我的第一堂课

 class snake:  
    def __init__(self, x, y, width, height):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.change_x = 0
        self.change_y = 0

这里是我的第二堂课

 class food:
    def __init__(self, food_x, food_y, food_width, food_height):
        self.x = food_x
        self.y = food_y
        self.width = food_width
        self.height = food_height
    def collition_detection(self):
        pass

我希望能够从蛇类到食品类访问位置(x,y),以便当我在食品类中执行“ collition_detection”功能时,不会对我说“ self.x”是一个错误没有定义的。谢谢。

3 个答案:

答案 0 :(得分:3)

您可以在方法中采用参数:

 class food:
    def __init__(self, food_x, food_y, food_width, food_height):
        self.x = food_x
        self.y = food_y
        self.width = food_width
        self.height = food_height

    def collition_detection(self, s):
        """ Return whether this food particle collides with the object `s`. """
        delta_x = math.abs(self.x - s.x)
        delta_y = math.abs(self.y - s.y)
        return (delta_x < (self.width + s.width) / 2) and (delta_y < (self.height + s.height) / 2)

更好的方法可能是定义一个对任何两个对象都有效的函数。这样,您可以将功能扩展到具有属性xyheightwidth的任何类。

def is_collision(obj1, obj2):
    """ Return whether obj1 and obj2 collide. """
    delta_x = math.abs(obj1.x - obj2.x)
    delta_y = math.abs(obj1.y - obj2.y)
    return (delta_x < (obj1.width + obj2.width) / 2) and (delta_y < (obj1.height + obj2.height) / 2)

然后可以按以下方式调用它:

s = Snake(...)
f_particle = food(...)

is_collision(s, f_particle)

答案 1 :(得分:2)

您必须实例化该类。然后,您可以使用其方法和功能,但不能使用其变量。在类中创建一个返回所需内容的函数,从另一个(或主程序)中实例化该类并获取返回的值。

这里有个例子:

class A:
    def m(self, x, y):
        return x + y

class B:
    def __init__(self):
        self.a = A()

    def call_a(self):
        a = self.a.m(1, 2)
        return a

c = B()
result = c.call_a()
print(result)

答案 2 :(得分:2)

一个简单的解决方法是将位置设置为类变量(在蛇的所有实例之间共享)。您只需将其声明为:

class snake:
    common_x = None
    common_y = None
    def __init__(self, x, y, width, height):
        common_x = x
        common_y = y
        self.width = width
        self.height = height

这些变量在蛇的所有实例之间共享,可以通过snake.common_xsnake1 = snake(args); snake1.common_x

访问

这回答了您关于如何从另一个类访问这些变量的问题。话虽如此,我建议您不要这样做,因为以后您可能会遇到问题。首先,这使您在游戏中只能有一条蛇。可以通过在班上列出一个位置来解决此问题,但我仍然不认为这是一种优雅的方法。我认为最好再开一个课,例如跟踪所有游戏对象的“游戏”。该课程将列出蛇,食物,敌人(?),以及您想要添加的内容。然后,您可以将所有元素连接到游戏实例,这就是它们能够进行通信的方式。

class game:
    def __init__(snakes=[], food=[]):
        self.snakes = snakes
        self.food = food

class snake:
    def __init__(x,y,game):
        self.x = x
        self.y = y
        self.game = game
        self.game.snakes.append(self)

class food:
    def __init__(self,...):
        ....

    def collide(self):
        for snake in self.game.snakes:
            if self.x == snake.x and self.y == snake.y:
                # do collision handling

这只是如何解决此问题的一个示例,我不确定,如果通过食物对象完成碰撞处理确实是最好的方法,但是我想您会明白的。