[英]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)
更好的方法可能是定義一個適用於任何兩個對象的函數。 這樣,您可以將功能擴展到具有屬性x
、 y
、 height
、 width
任何類。
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_x
或snake1 = 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.