名称错误:全局名称 'myExample2' 未定义 # 模块

9

这是我的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

我该如何解决这个问题?

2
你需要定义一个函数 myExample2(self, num),然后可以通过 self.myExample2() 来调用它。 - Peter Varo
5个回答

11

这是对您的代码的简单修复。

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

我看到你的代码中有两个错误:

  1. 你需要用 self.myExample2(...) 来调用 myExample2
  2. 你需要在定义 myExample2 时加上 selfdef myExample2(self, num): ...

1

首先,我同意alKid的回答。这实际上更像是对问题的评论而不是答案,但我没有足够的声望来发表评论。

我的评论:

导致错误的全局名称是myImport而不是myExample2

解释:

我的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

我在查找自己代码中一个模糊的“全局名称未定义”错误时发现了这个问题。由于问题中的错误消息是不正确的,所以我更加困惑了。当我实际运行代码并看到实际的错误时,一切都变得清晰明了。
我希望这可以防止任何人遇到与我相同的问题。如果有比我更高声望的人想将其转换为评论或修复问题,请随意。

对于那些因为我没有回答问题而责备我的人,我道歉。简而言之,问题中的代码示例并不会产生错误。这个问题无法回答! - Dennis

0
你需要创建一个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

虽然其他答案是正确的,但我想知道是否真的需要将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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接