2009-04-06 13 views
0

に私は私のmain.pyPythonのクラスを含める間違った行動

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

に持っているとcontrollor.pyは次のとおりです。

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

私は私のメインを実行すると、私はエラーを得た:

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

何が間違っていますか?

答えて

1

次のコードを実行すると

from modules import controller 
ctrl = controller 

CTRL変数がコントローラクラスへのポインタになります。

from modules import controller 
ctrl = controller() 
2

あなたはこのように、コントローラのインスタンスを作成する必要があります。

ctrl = controller() 

は、コントローラの後の括弧に注意してください。

3

ctrl = controller

'controller'は、 'controller.py'ファイル全体を表すモジュールです。 Pythonでは、Javaとは異なり、モジュール内に定義されたシンボルはいくつでも構いません。そのため、インポートされたモジュールとそこに定義されたクラスの間に1対1の関係はありません。

したがって、 'controller'モジュールに 'div'機能がないため、スクリプトがエラーになります。 'div'は 'コントローラ'クラスのメソッドとして 'コントローラ'モジュールのメソッドとして定義されています。あなたは、コントローラ()クラスのインスタンスをしたい場合はあなたが言う必要があります。

ctrl= controller.controller() 

(注も()オブジェクトをインスタンス化するために、またはあなたは、インスタンスではなくクラス自体を取得することがありますあなたの場合。クラス内に静的メソッドを定義してインスタンスなしで呼び出せるようにするには、 'staticmethod'デコレータを使用して 'self'を省略することができます)。

通常はクラスを混乱を避けるための初期資本:

class Controller(object): 
    ... 

ctrl= controller.Controller() 
+0

はい、それは初期投資を使用して動作しますが、ありません:あなたは括弧を追加する必要がコントローラクラスのインスタンスを作成するには – DrFalk3n

4

示されているように非常に混乱します。あなたは

from modules import controller 

を言うとき

あなたはmodules.pyのファイル名を持つモジュールを持って主張を作っています。

OR

あなたはmodulesという名前のパッケージを持って主張を作っています。このディレクトリには__init__.pyファイルがあり、ファイル名はcontroller.pyです。

これは正確であることを明確にしてください。ここに掲示されているサンプルコードのファイルとモジュールを誤って指定したようです。

あなたはcontrollerという名前モジュール(ないクラス)を作成

from modules import controller 

を言うとき。controllerモジュールctrlに別の名前を作成します

あなたは

ctrl = controller 

言います。

クラス(controller.controller)を参照することはできません。クラスのインスタンス(controller.controller())は作成しませんでした。

関連する問題