【问题标题】:Calling functions defined within a class - NameError: name 'filename' is not defined [duplicate]调用类中定义的函数-NameError:未定义名称“文件名”[重复]
【发布时间】:2021-03-04 19:37:37
【问题描述】:

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

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

【问题讨论】:

  • 您需要使用self.filename
  • 在哪些职位?我在所有 4 个对文件名的引用中都尝试了 self.filename,每个都给我一个错误,要么是相同的,要么是语法错误。
  • 在任何你想引用实例变量而不是局部变量或方法参数的地方都需要它。

标签: python function class


【解决方案1】:

就像filename 是你的类sgrid 的超类。 但是没有名为filename的类,所以没有找到。

你必须将自引用传递给你的所有方法。

我不太确定你想做什么,但如果你想创建一个带有文件名和 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】:

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

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】:

    你可能想要这样:

    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()
    

    【讨论】:

      【解决方案4】:
      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)    
      

      【讨论】:

      • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释并说明适用的限制和假设。
      猜你喜欢
      • 2017-09-14
      • 1970-01-01
      • 2018-08-01
      • 2020-06-17
      • 2016-07-06
      • 2015-10-22
      • 2016-05-12
      • 2011-11-19
      • 1970-01-01
      相关资源
      最近更新 更多