web-dev-qa-db-ja.com

NameError:グローバル名 'myExample2'が定義されていません#モジュール

これが私のexample.pyファイルです。

from myimport import *
def main():
    myimport2 = myimport(10)
    myimport2.myExample() 

if __name__ == "__main__":
    main()

そしてここにmyimport.pyファイルがあります:

class myClass:
    def __init__(self, number):
        self.number = number
    def myExample(self):
        result = myExample2(self.number) - self.number
        print(result)
    def myExample2(num):
        return num*num

example.pyファイルを実行すると、次のエラーが発生します。

NameError: global name 'myExample2' is not defined

どうすれば修正できますか?

8
Michael

これがコードの簡単な修正です。

from myimport import myClass #import the class you needed

def main():
    myClassInstance = myClass(10) #Create an instance of that class
    myClassInstance.myExample() 

if __name__ == "__main__":
    main()

そしてその myimport.py

class myClass:
    def __init__(self, number):
        self.number = number
    def myExample(self):
        result = self.myExample2(self.number) - self.number
        print(result)
    def myExample2(self, num): #the instance object is always needed 
        #as the first argument in a class method
        return num*num
9
aIKid

コードに2つのエラーが表示されます。

  1. _myExample2_をself.myExample2(...)として呼び出す必要があります
  2. MyExample2を定義するときにselfを追加する必要があります:def myExample2(self, num): ...
9
shx2

まず、alKidの回答に同意します。これは回答よりも質問に対するコメントのほうが多いですが、コメントする評判はありません。

私のコメント:

エラーの原因となるグローバル名はmyImportであり、myExample2ではありません

説明:

My Python 2.7によって生成される完全なエラーメッセージは次のとおりです。

Message File Name   Line    Position    
Traceback               
    <module>    C:\xxx\example.py   7       
    main    C:\xxx\example.py   3       
NameError: global name 'myimport' is not defined

この質問は、自分のコードで不明な「グローバル名が定義されていません」エラーを追跡しようとしたときに見つかりました。質問のエラーメッセージが正しくないため、混乱してしまいました。実際にコードを実行して実際のエラーを確認したところ、すべてが理にかなっています。

これにより、このスレッドを見つけた人が私と同じ問題を起こすのを防ぐことができます。私よりも評判の高い人がコメントにしたり、質問を修正したりする場合は、遠慮なくお問い合わせください。

1
Dennis

モジュール全体のインスタンスではなく、myClassクラスのインスタンスを作成する必要があります(そして、変数名を編集して、それほどひどくないようにします)。

from myimport import *
def main():
    #myobj = myimport.myClass(10)
    # the next string is similar to above, you can do both ways
    myobj = myClass(10)
    myobj.myExample() 

if __name__ == "__main__":
    main()
0
Feanor

他の答えは正しいですが、myExample2()がメソッドである必要が本当にあるのでしょうか。スタンドアロンで実装することもできます。

def myExample2(num):
    return num*num

class myClass:
    def __init__(self, number):
        self.number = number
    def myExample(self):
        result = myExample2(self.number) - self.number
        print(result)

または、名前空間をクリーンに保ちたい場合は、メソッドとして実装しますが、selfは必要ないため、@staticmethod

def myExample2(num):
    return num*num

class myClass:
    def __init__(self, number):
        self.number = number
    def myExample(self):
        result = self.myExample2(self.number) - self.number
        print(result)
    @staticmethod
    def myExample2(num):
        return num*num
0
glglgl