提问人:Wade 提问时间:8/1/2023 最后编辑:Rabbid76Wade 更新时间:8/1/2023 访问量:26
来自错误文件的类调用属性
Class calls attribute from wrong file
问:
我收到错误 - AttributeError:“User_input_responses”对象没有属性“screen”。 我相信在我的 Ship() 文件中,self.screen = game.screen 错误地查看User_input_responses而不是查看Alien_Invasion以访问屏幕。不知道如何解决?
主文件 -
import pygame
from ship_movement import User_input_responses
from settings import Settings
from ship_test import Ship
class Alien_Invasion:
def __init__(self):
pygame.init()
self.settings = Settings()
#screen
self.screen = pygame.display.set_mode((self.settings.screen_width , self.settings.screen_height))
pygame.display.set_caption(("Alien Invader"))
self.bg_color = self.settings.bg_color
self.clock = pygame.time.Clock()
self.ship = Ship(self)
self.movement = User_input_responses()
def update_screen(self):
pygame.display.flip()
self.screen.fill(self.bg_color)
self.ship.blitme()
def game(self):
while True:
self.movement.user_input_reactions()
self.ship.ship_movement()
self.update_screen()
self.clock.tick(60)
if __name__ == '__main__':
game_launcher = Alien_Invasion()
game_launcher.game()
文件调用属性 -
import pygame
from settings import Settings
class Ship:
def __init__(self, game):
self.settings = Settings()
self.screen = game.screen
self.screen_rect = self.screen.get_rect()
self.image = pygame.image.load("images/ship.bmp")
self.rect = self.image.get_rect()
self.rect.center = self.screen_rect.center
self.x = float(self.rect.x)
self.y = float(self.rect.y)
文件给出错误
import pygame
import sys
from ship_test import Ship
class User_input_responses:
def __init__(self):
self.ship = Ship(self)
def user_input_reactions(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
self.keydown(event)
elif event.type == pygame.KEYUP:
self.keyup(event)
答:
0赞
John Gordon
8/1/2023
#1
class User_input_responses:
def __init__(self):
self.ship = Ship(self)
该类的方法声明一个对象并将自身作为参数传递。__init__
User_input_responses
Ship
class Ship:
def __init__(self, game):
self.settings = Settings()
self.screen = game.screen
类的方法期望参数具有属性。__init__
Ship
game
screen
但 是 的实例,它没有属性。game
User_input_responses
screen
评论
0赞
Wade
8/1/2023
我相信 class 也可以这样做,并且确实具有属性。当我从中删除不传递自身时,我收到另一个错误。Alien_Invasion
screen
self
self.ship = Ship()
TypeError: Ship.__init__() missing 1 required positional argument: 'game'
0赞
John Gordon
8/1/2023
@Wade 创建实例需要传递参数。所以是的,如果你删除这个参数,你会得到一个错误。我不明白你的评论。Ship
0赞
John Gordon
8/1/2023
@Wade我相信Alien_Invasion类也可以这样做,是的,它确实如此,但它在这种情况下有效,因为该类确实具有屏幕属性。该类没有 screen 属性,因此您会收到错误。Ship
0赞
John Gordon
8/1/2023
@Wade 感觉就像你在和我争论,说我的答案是错误的。
0赞
Wade
8/1/2023
那么你说的是,既然需要传递一个 arugement 并且使用了 arugement 的属性,那么我不能在没有定义的情况下创建实例并使用其属性?如果我添加参数的要求,然后Alien_invasion传递到其中并创建复制属性,这会起作用吗?我的逻辑是,如果我User_input_responses访问Alien_Invasion属性,那么当 Ship 调用它时它会起作用吗?Ship()
screen
Ship
Ship()
screen
User_input_responses
sceen
screen
评论