1

このコードを機能させることはできますが、最初に試した方法ではなぜ機能しないのか、まだ混乱しています。

私の論文はそれでコード化される予定なので、私はPythonを練習しています(ArduinoとPCインターフェースでいくつかのクールなことをしています)。オブジェクトを作成できるように、クラスを別のファイルからメイン プログラムにインポートしようとしています。両方のファイルは同じディレクトリにあります。この時点でコードを確認すると、おそらく簡単です。

#from ArduinoBot import *
#from ArduinoBot import ArduinoBot
import ArduinoBot

# Create ArduinoBot object
bot1 = ArduinoBot()

# Call toString inside bot1 object
bot1.toString()

input("Press enter to end.")

これは非常に基本的なArduinoBotクラスです

class ArduinoBot:

def toString(self):
    print ("ArduinoBot toString")

コメントアウトされた最初の 2 つの import ステートメントのいずれかでこの作業が行われますが、最後のものではなく、最も直感的で一般的です。ここで問題が発生するコードはあまりありません。Python について多くの良いことを聞いていたときに、この種の厄介な言語固有の癖にぶつかるのは少しイライラします。とにかく、私は何か間違ったことをしているに違いありませんが、単純な 'import ClassName' または 'import FileName' が機能しないのはなぜですか?

ご協力ありがとうございました。

4

4 に答える 4

5

ファイル ( example.py)を検討します。

class foo(object):
    pass

class bar(object):
    pass

class example(object):
    pass

メインプログラムで、次のようにします。

import example

ファイルから何をインポートする必要がありますexample.pyか? クラスだけexample?クラスfooも一緒に来る必要がありますか?import moduleモジュールの名前空間全体を現在の名前空間に直接プルすると、意味があいまいになります。

名前空間は素晴らしいという考えです。クラス/関数/データがどこから来たのかを知らせてくれます。また、関連するものをグループ化することもできます (または、関連のないものを分離するのに役立ちます)。モジュールは名前空間を設定し、使用する方法でその名前空間を現在のコンテキスト (名前空間) にどのように持ち込むかを python に正確に伝えますimport

from ... import *言う - そのモジュールのすべてを私の名前空間に直接持ってきてください。

from ... import ... as ...私が指定したものだけを自分の名前空間に直接持ち込むが、ここでは新しい名前を付けます。

最後に、import ...そのモジュールを現在の名前空間に持ち込むが、それを分離したままにするだけです。これは、(少なくとも) 2 つの理由から、製品コードで最も一般的な形式です。

  • 名前の競合を防ぎます。infooと競合しない名前のローカル クラスを使用できます。fooexample.pyexample.foo
  • クラスがデバッグのためにどのモジュールから来たのかを簡単に追跡できます。

検討:

from foo import *
from bar import *
a = AClass() #did this come from foo?  bar? ... Hmmm...

この場合、 からクラスにアクセスするにはexample、次のexample.pyようにすることもできます。

import example
example_instance = example.example()

しかし、あなたも得ることができますfoo

foo_instance = example.foo()
于 2013-01-06T04:31:47.947 に答える
1

簡単な答えは、モジュールは Python のものです。モジュールには、クラス、関数、およびその他のオブジェクトのコンテナーとしての独自のステータスがあります。するとimport ArduinoBot、モジュールがインポートされます。そのモジュール内のもの (クラス、関数など) が必要な場合は、それらが必要であることを明示的に言わなければなりません。で直接インポートするか、モジュールを介してとfrom ArduinoBot import ...でアクセスすることができます。import ArduinoBotArduinoBot.ArduinoBot

これに反対する代わりに、モジュールのコンテナー性を活用して、関連するものをモジュールにグループ化できるようにする必要があります。ファイルにクラスが 1 つしかない場合は面倒に思えるかもしれませんが、複数のクラスと関数を 1 つのファイルに入れ始めると、実際にはすべてのものを自動的にインポートしたくないことがわかるでしょうimport module。すべてのモジュールのすべてが他のものと競合します。モジュールは、さまざまな機能を分離する際に便利な機能を果たします。

あなたの例では、自問すべき質問は次のとおりです。コードが非常にシンプルでコンパクトな場合、なぜすべてを 1 つのファイルに入れなかったのですか?

于 2013-01-06T04:51:28.377 に答える
0

モジュール自体はオブジェクトです。モジュールのメンバーとしてクラスにアクセスする場合、最後のアプローチは実際に機能します。インポートされたアイテムから他に何が必要かによって、次のいずれかが機能するか、どちらかが適切である可能性があります。

from my_module import MyClass 
foo = MyClass()

また

import my_module
foo = my_module.MyClass()

コメントで述べたように、モジュールとクラスは通常、Pythonでは同じ名前ではありません。これはJavaの問題であり、ここで少し混乱することがあります。

于 2013-01-06T05:01:51.027 に答える
0

インポートは、思ったほどうまくいきません。動作するように文書化されている方法で動作するため、問題に対する非常に簡単な解決策がありますが、それでも:

import ArduinoBot

これにより、インポート パスでモジュール (またはパッケージ) が検索され、モジュールのコードが新しい名前空間で実行され、モジュール オブジェクト自体ArduinoBot現在の名前空間の名前にバインドされます。これは、モジュールで名前が付けられたモジュール グローバル変数ArduinoBotArduinoBot、インポートする名前空間で としてアクセスできるようになることを意味しますArduinoBot.ArduinoBot

from ArduinoBot import ArduinoBot

これは、上記のようにモジュールをロードして実行しますが、モジュール オブジェクトを name にバインドしませんArduinoBot。代わりに、モジュール内でモジュール グローバル変数を検索し、現在のネームスペース内のArduinoBot名前を参照しているオブジェクトをバインドします。ArduinoBot

from ArduinoBot import *

上記と同様に、これは、モジュール オブジェクトを現在のネームスペース内の名前にバインドせずに、モジュールをロードして実行します。次に、すべてのモジュール グローバル変数を検索し、それらすべてを現在のネームスペース内の同じ名前にバインドします。

この最後の形式は、Python シェルでのインタラクティブな作業には非常に便利ですが、実際にバインドする名前が明確でないため、実際の開発では一般的に不適切なスタイルと見なされます。グローバル スコープでインポートされた名前を含む、インポートされたモジュール内のすべてのグローバルをインポートすることを考慮すると、このスタイルを広範囲に使用すると、スコープ内の名前や名前がどこから来たのかをすぐに知ることが非常に困難になります。

于 2013-01-06T04:49:45.297 に答える