2016-08-10 11 views
0

Ich versuche zu lernen, wie ich meine Programme ändern, so dass sie Code aus mehreren Python-Skripten verwenden. Ich habe zwei Skripte (diese sind große Dateien, so dass sie schneiden nur nach unten, was gebraucht wird)Erstellen einer Instanz einer Klasse in einer anderen Datei (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() 

des Lauf gibt mir die folgenden Fehler :

Ich verstehe nicht ganz, warum es versucht, ein Attribut zu erhalten, anstatt ein Insta zu erstellen nce. Ich habe versucht, andere Beispiele zu betrachten und wie sie das Problem lösen, aber wenn ich versuche, es auf den Code oben anzuwenden, löst es mein Problem nicht.

+1

'' 'von Spieler Import hero'''? ? –

+0

Warum importieren Sie 'main' in' player' ??? –

+5

Sie importieren Player in Haupt und Haupt in Player. Das verursacht normalerweise Probleme, da es eine Art Schleife erzeugt. – Athena

Antwort

0

Wie Athena oben gesagt, importieren Sie nicht main in player und player in main. Dies verursacht eine Importschleife. Importieren Sie einfach einfach player in main

Zweitens müssen Sie player.hero() sagen, wenn Sie die Klasse hero vom player Modul verwenden möchten. Oder wenn Sie nur hero() sagen möchten, können Sie from player import* sagen. Dies weist python an, alle Dateien von player in den Namespace main zu importieren.

Seien Sie vorsichtig dabei, da eine Funktion oder Klasse von Ihrer Player-Datei Konflikt mit einer bereits bestehenden Funktion oder Klasse, mit dem gleichen Namen.

Und als eine Randnotiz, Klassen in Python General haben ihren ersten Buchstaben Großbuchstaben.

hier ist, wie Sie Ihre Dateien aussehen sollte:

main.py

import pygame 
import player #Imports the player.py script 
p1 = hero("woody.png",[2,2]) #Creates an instance of hero 

Spieler.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

Ich verstehe nicht, warum Leute Import * vorschlagen, dann muss eine Warnung geben. Es gibt zwei vollkommen gute (und bessere) Möglichkeiten, dies zu tun. player.hero() und hero() nach dem Import des Helden vom Player. https://www.python.org/dev/peps/pep-0020/;) –

+0

@JamesMcCormac Nun, das könnte eine praktikable Option für ihn sein. Ich gebe ihm nur eine Warnung. Ich lasse ihn wählen, was am besten funktioniert. –

+0

Nun, da das OP Probleme mit Importen hat, könnte es das Beste sein, die beiden expliziten Ansätze vorzuschlagen und das implizite zu ignorieren. –

0

Drop the import main in player.py und ändern Sie die letzte Zeile in main.py zu:

p1 = player.hero("woody.png",[2,2]) 

Edit: Python nicht weiß, welche Klasse/Funktion hero ist. Du musst sagen, dass der Held eine Klasse im Spielermodul ist. Und das ist was player.hero bedeutet.

Auch nie ein Modul von einem anderen importieren und umgekehrt. Sie können eine Import-Schleife erhalten, die sehr schwer zu debuggen ist.

Schließlich ist es in Python üblich, eine Klasse mit einem Großbuchstaben als Hero anstelle von hero zu benennen.

1
  1. Um hero von einem anderen Modul zu importieren, sollten Sie player.hero oder einfach from player import hero schreiben.

  2. Importieren player in main und main in player würde "circular references" verursachen.


Hier ist der modifizierte Code:

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 
+0

Sorry, Alter. Ich meine nicht, redigiere deine Frage. Der Gedanke gehört mir. –

+0

@ Mr.Python Ich habe Ihre Bearbeitung genehmigt, also egal :) –

+0

Ok danke. Die Finger sind nur eine Sekunde dem Gehirn voraus :) –

Verwandte Themen