来自错误文件的类调用属性

Class calls attribute from wrong file

提问人:Wade 提问时间:8/1/2023 最后编辑:Rabbid76Wade 更新时间:8/1/2023 访问量:26

问:

我收到错误 - 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)
Python OOP 方法 AttributeError

评论


答:

0赞 John Gordon 8/1/2023 #1
class User_input_responses:
    def __init__(self):
        self.ship = Ship(self)

该类的方法声明一个对象并将自身作为参数传递。__init__User_input_responsesShip

class Ship:
    def __init__(self, game):
        self.settings = Settings()
        self.screen = game.screen

类的方法期望参数具有属性。__init__Shipgamescreen

但 是 的实例,它没有属性。gameUser_input_responsesscreen

评论

0赞 Wade 8/1/2023
我相信 class 也可以这样做,并且确实具有属性。当我从中删除不传递自身时,我收到另一个错误。Alien_Invasionscreenselfself.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()screenShipShip()screenUser_input_responsessceenscreen