1

私は優れた「Python The Hard Way」に取り組んでおり、次のコードを mystuff.py というファイルにコピーしました。

class MyStuff(object):

    def __init__(self):
        self.tangerine = "And now a thousand years between"

    def apple(self):
        print "I AM CLASSY APPLES!"

ターミナルで:

import mystuff

thing = MyStuff()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'MyStuff' is not defined

これは、今日の他の単純なクラスで繰り返し発生しています。誰かが私が間違っていることを教えてもらえますか?

4

3 に答える 3

7

おそらく必要です(クラスが存在するファイルの名前であるとthing = mystuff.MyStuff() 仮定します)。mystuffMyStuff

ここでの問題は、python が名前空間を処理する方法にあります。インポートすることで現在の名前空間に何かを持ち込むことができますが、あるファイルから別のファイルに名前空間をマージする方法には多くの柔軟性があります。例えば、

import mystuff

は、mystuff (モジュール/ファイル レベル) 名前空間から現在の名前空間にすべてをもたらしますが、それにアクセスするには が必要mystuff.function_or_class_or_dataです。常に入力したくない場合mystuffは、現在のモジュール (ファイル) で参照するために使用する名前を変更できます。

import mystuff as ms

現在、次の方法でアクセスできますMyStuff

thing = ms.MyStuff()

そして(ほとんど)最後に、from mystuff import MyStuff. この形式ではMyStuff、名前空間に直接取り込みますが、名前空間には from 以外のものは入りませんmystuff

最後に (これはお勧めしません) from mystuff import *. これは前のものと同じように機能しますが、mystuffファイル内の他のすべてのものも取得してインポートします。

于 2012-09-10T14:32:18.387 に答える
5

モジュールをローカル名前空間にインポートしていますが、クラスはインポートしていません。現在のインポートでクラスを使用する場合は、次のものが必要です。

thing = mystuff.MyStuff()

持っている宣言を使用する場合は、次のものが必要です。

from mystuff import MyStuff
于 2012-09-10T14:33:18.977 に答える
0

わかりました、私はあなたが必要なものを手に入れたと思いますが、ここで何が起こっているのですか

import mystuff 

#with this type of import all the names in the `mystuff` module's namespace are not copied into current modules namespace.

だからあなたは使う必要がありますmystuff.MyStuff()

モジュールの名前空間の名前を現在のモジュールの名前空間from mystuff import *にコピーするために使用します。これで、直接使用できます。mystuffthing=MyStuff()

于 2012-09-10T14:50:15.460 に答える