创建一个存在于不同文件中的类的实例(python)

时间:2016-08-10 04:06:10

标签: python python-2.7 oop

我正在尝试学习如何更改我的程序,以便他们使用来自多个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'

我不太明白为什么它试图获取属性而不是创建实例。我已经尝试过查看其他示例以及它们如何解决问题,但是当我尝试将其应用于上面的代码时,它并没有解决我的问题。

3 个答案:

答案 0 :(得分:1)

  1. 要从其他模块导入hero,您应该写player.hero,或只是from player import hero

  2. 导入player中的mainmain中的player会导致“循环引用”。

  3. 以下是修改后的代码:

    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