簡體   English   中英

如何從一個類訪問變量並在另一個類中使用它?

[英]How can i access a variable from one class and use it in another class?

這是我的第一堂課

 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”未定義。 謝謝。

您可以在方法中使用一個參數:

 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)

你必須實例化這個類。 然后你可以使用它的方法和函數,但不能使用它的變量。 在類中創建一個函數,返回您需要的內容,從另一個(或主程序)中實例化該類並獲取返回的值。

下面是一個例子:

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)

一個簡單的解決方法是使位置成為類變量(在蛇的所有實例之間共享)。 您只需將其聲明為:

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 實例之間共享,可以通過snake.common_xsnake1 = snake(args); snake1.common_x snake1 = 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

這只是一個關於如何解決這個問題的例子,我不確定,如果由食物對象完成碰撞處理真的是最好的方法,但我想你明白了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM