我正在尝试学习如何更改我的程序,以便他们使用来自多个python脚本的代码。我有两个脚本(这些是大文件,所以只需要将它们减少到需要的地方)
main.py
import pygame
import player #Imports the player.py script
p1 = hero("woody.png",[2,2]) #Creates an instance of hero
player.py
import pygame
import main
class hero:
def __init__(self,image,speed):
self.image = pygame.image.load(image)
self.speed = speed
self.pos = self.image.get_rect()
运行此命令会出现以下错误:
AttributeError: 'module' object has no attribute 'hero'
我不太明白为什么它试图获取属性而不是创建实例。我已经尝试过查看其他示例以及它们如何解决问题,但是当我尝试将其应用于上面的代码时,它并没有解决我的问题。
答案 0 :(得分:1)
要从其他模块导入hero
,您应该写player.hero
,或只是from player import hero
。
导入player
中的main
和main
中的player
会导致“循环引用”。
以下是修改后的代码:
main.py
import pygame
from player import hero # Imports the player.py script
p1 = hero("woody.png",[2,2]) # Creates an instance of hero
player.py
import pygame
class hero:
def __init__(self,image,speed):
self.image = pygame.image.load(image)
self.speed = speed
self.pos = self.image.get_rect()#.....etc
答案 1 :(得分:0)
将import main
放入player.py并将main.py中的最后一行更改为:
p1 = player.hero("woody.png",[2,2])
修改强>
Python不知道类{/ 1}}是什么类。它需要你告诉它英雄是玩家模块中的一个类。这就是hero
的含义。
也永远不要从另一个模块导入一个模块,反之亦然。你可以得到一个很难调试的导入循环。
最后,在python中,通常将大写字母命名为player.hero
而不是Hero
。
答案 2 :(得分:0)
与上述Athena一样,请勿将main
导入player
,将player
导入main
。这会导致导入循环。只需将player
导入main
其次,如果要使用player.hero()
模块中的类hero
,则必须说player
。或者,如果您只想说hero()
,则可以说from player import*
。这告诉python将player
中的所有文件导入名称空间main
。
请小心使用,因为播放器文件中的函数或类可能与已经退出的函数或类冲突,但名称相同。
作为旁注,python general中的类首字母大写。
以下是您的文件的外观:
<强> main.py 强>
import pygame
import player #Imports the player.py script
p1 = hero("woody.png",[2,2]) #Creates an instance of hero
<强> player.py 强>
import pygame
class hero:
def __init__(self,image,speed):
self.image = pygame.image.load(image)
self.speed = speed
self.pos = self.image.get_rect()#.......etc