调用类中定义的函数 - NameError: name 'filename' is not defined

时间:2021-03-04 19:37:37

标签: python function class

我是 Python 新手,正在努力学习课程。这是我的代码。

class sgrid(filename):
    def __init__(filename): 
        filename = self.filename # do I need these?
        print_to_app2 = self.print_to_app2   # do I need these?

    def print_to_app2(text):
        print(text)

    def iterate(filename):
        self.print_to_app2(filename)
        self.print_to_app2('Application is initializing')



if __name__ == '__main__':
    sgrid=sgrid()

filename = "a_file_name"
sgrid.iterate(filename)    

我收到此错误:NameError: NameError: name 'filename' is not defined

我做错了什么?我希望能够在这个类内部和外部调用函数。

4 个答案:

答案 0 :(得分:0)

你可能想要这个:

class sgrid(object):
    def __init__(self,filename):
        self.filename = filename # do I need these?

    def print_to_app2(self,text):
        print(text)

    def iterate(self):
        self.print_to_app2(self.filename)
        self.print_to_app2('Application is initializing')


if __name__ == '__main__':
    filename = "a_file_name"
    sgrid=sgrid(filename)
    sgrid.iterate()

答案 1 :(得分:0)

就像 filename 是你的类 sgrid 的超类。 但是没有名为 filename 的类,因此找不到它。

并且您必须将 self 引用传递给您的所有方法。

我不太确定你想做什么,但如果你想创建一个带有文件名和 print_to_app2 文件名的 sgrid,你可以像这样尝试:

class sgrid:
    def __init__(self, filename): 
        self.filename = filename

    def print_to_app2(self, text):
        print(text)

    def iterate(self):
        self.print_to_app2(self.filename)
        self.print_to_app2('Application is initializing')



if __name__ == '__main__':
    filename = "a_file_name"
    sgridInstance=sgrid(filename)

    sgridInstance.iterate()    

答案 2 :(得分:0)

这个脚本中有很多错误的地方:) 但这里描述的主要内容在第一行。

class sgrid(filename):

这是您定义类的地方,您将作为第一个参数 filename 传递,程序不知道该参数。你应该把它留空。

还有其他错误。

class sgrid():
    # I fixed the declaration above.
    def __init__(self, filename):
        self.filename = filename

    def iterate(self, filename=None):
        if filename is None:
            filename = self.filename

        print("App is initializing")
        print(filename)



if __name__ == '__main__':
    sgrid=sgrid() # this will produce an error, i leave that up to you
    # PS : are you sure you want to name this variable "sgrid" ? :)

filename = "a_file_name"
sgrid.iterate(filename)   

当您调用 class 时,您的方法的第一个位置参数默认传递给函数。并且需要在声明函数的时候注明,这个变量的名字是self。这是一个变量,用于保存您可以在类中的方法之间共享的值。

我还修复了其他一些错误。我邀请你阅读代码,提出问题,也许看看文档。 :)

答案 3 :(得分:0)

class sgrid:
    def __init__(self , filename): 
        filename = self.filename 
        

    def print_to_app2(text):
        print(text)

    def iterate(filename):
        self.print_to_app2(filename)
        self.print_to_app2('Application is initializing')



if __name__ == '__main__':
    sgrid=sgrid()

filename = "a_file_name"
sgrid.iterate(filename)