2009-04-06 10 views
0

Ich habe in meinem main.pyPython Klasse Inklusion falsches Verhalten

from modules import controller 
ctrl = controller 
help(ctrl) 
print(ctrl.div(5,2)) 

und die controllor.py ist:

class controller: 
    def div(self, x, y): 
     return x // y 

, wenn ich meine laufen Haupt ich den Fehler bekam:

Traceback (most recent call last): 
    File "...\main.py", line 8, in ? 
    print(ctrl.div(5,2)) 
AttributeError: 'module' object has no attribute 'div' 

WHat ist falsch?

Antwort

1

Wenn Sie folgenden Code ausführen

from modules import controller 
ctrl = controller 

ctrl Variable ein Zeiger auf Controller Klasse wird. Um eine Instanz Controller Klasse, die Sie Klammer hinzufügen müssen zu erstellen:

from modules import controller 
ctrl = controller() 
2

Sie sollten eine Instanz-Controller, wie diese erstellen:

ctrl = controller() 

Hinweis die Klammern nach dem Controller.

3

ctrl = controller

‚Controller‘ ist ein Modul, was Ihre ganze ‚controller.py‘ Datei. Anders als in Java kann es in Python eine beliebige Anzahl von Symbolen geben, die innerhalb eines Moduls definiert sind. Es gibt also keine 1: 1-Beziehung zwischen dem importierten Modul und der darin definierten Klasse.

Also beschwert sich das Skript, weil das Modul 'controller' keine 'div'-Funktion hat; 'Div' ist definiert als eine Methode der 'controller'-Klasse innerhalb des' Controller 'Moduls. Wenn Sie eine Instanz des Controllers() der Klasse wollen, müssen Sie sagen:

ctrl= controller.controller() 

(Beachten Sie auch die(), um das Objekt zu instanziieren, oder Sie die Klasse selbst eher als eine Instanz bekommen, wenn Sie. Wollen Sie wirklich eine statische Methode in der Klasse definieren, so dass Sie sie ohne eine Instanz aufrufen können, können Sie dies mit dem 'staticmethod' Dekorator tun und 'self' weglassen.)

Es ist normalerweise am besten, Ihre Klassen mit einem Namen zu benennen Anfangskapital, um Verwirrung zu vermeiden:

class Controller(object): 
    ... 

ctrl= controller.Controller() 
+0

ja, es funktioniert aber nicht mit Anfangskapital – DrFalk3n

4

Dies ist sehr verwirrend wie gezeigt.

Wenn Sie sagen,

from modules import controller 

Sie machen die Behauptung, dass Sie ein Modul mit einem Dateinamen von modules.py haben.

ODER

Sie machen die Behauptung, dass Sie ein Paket modules benannt haben. Dieses Verzeichnis enthält eine __init__.py Datei und ein Modul mit dem Dateinamen controller.py

Sie sollten dies präzisieren. Es sieht so aus, als hätten Sie Ihre Dateien und Module in dem hier angegebenen Beispielcode falsch benannt.

Wenn Sie

from modules import controller 

sagen, dass ein Modul (keine Klasse) mit dem Namen controller schafft.

Wenn Sie

ctrl = controller 

sagen, dass ein anderer Name für dascontrollerModul erstellt, ctrl.

Zu keiner Zeit verweisen Sie auf die Klasse (controller.controller). Zu keiner Zeit haben Sie eine Instanz der Klasse erstellt (controller.controller()).

Verwandte Themen