【问题标题】:importing class and its function from another file从另一个文件导入类及其功能
【发布时间】:2010-06-01 10:38:03
【问题描述】:

我在 python 中导入类没有什么问题。我的工作流程是这样的

index.py

    class Template:

        def header():
        def body():
        def form():
        def footer():

display.py

我想在我的display.py 页面中调用函数header()body()footer ()。有人会在python中让我清楚这个问题吗?感谢您的关心。

索引文件--- [Index.py][1]

[1]:http://pastebin.com/qNB53KTE 和 display.py -- "http://pastebin.com/vRsJumzq"

【问题讨论】:

  • 我建议您阅读更多 Python 教程。那里有很多例子。 =]
  • 另外,请注意 Python 风格指南 (python.org/dev/peps/pep-0008) 建议在类名中使用 CapWords,而不是全部小写字母。
  • 感谢代码!否则我们无法弄清楚。现在去接受更多的答案。 =3

标签: python class


【解决方案1】:

你试过什么?以下是导入后使用Template类方法的正常方式。

from index import Template

t = Template()
t.header()
t.body()
t.footer()

ETA: 在您的 index.py 文件末尾(第 99-105 行),您正在调用上述 Template 类中的所有函数。这就是您看到重复的原因。

【讨论】:

  • 我和你一样尝试过。但我总是重复 2 次 body() 等
  • @user:您可能正在调用来自Template__init__ 的方法。否则,此代码中没有任何内容会产生重复。
【解决方案2】:

在索引文件的底部创建一个HtmlTemplate 对象并调用其上的所有方法。由于此代码不包含在任何其他块中,因此它会在您导入模块时执行。您要么需要删除它,要么检查文件是否正在从命令行运行。

if __name__ == "__main__":
    objx=HtmlTemplate()
    objx.Header()
    objx.Body()
    objx.Form()
    objx.Footer()
    objx.CloseHtml()

【讨论】:

    【解决方案3】:

    编辑:好的,我知道你的问题是什么,给定你的代码。

    您正在调用以下内容:

    ## Calling all the functions of the class template with object (objx)
    objx=HtmlTemplate()
    objx.Header()
    objx.Body()
    objx.Form()
    objx.Footer()
    objx.CloseHtml()
    

    然后在你的display.py:

    t = HtmlTemplate()
    t.Header()
    t.Body()
    

    看看Body() 是如何被调用两次的?

    作为脚注,您应该像现在一样使用小写的方法名称和类的大写单词。这是一个很好的约定。我强烈推荐它。

    您应该在display.py 中简单地构造一次对象并调用所有方法。

    【讨论】:

    • 是的,每个函数都有我知道的 self 参数
    • 您还有什么问题?能否提供更多代码给我们?
    • 就像我上面的工作流程一样,我有 index.py 文件[具有给定的类和功能],并且我想从 index.py 文件中将值从 form() 传递给 display.py。在 display.py 中,我只需要调用 header()、body() 和 footer()。但是我正在做和你们说的一样的事情,但是在显示页面中得到了重复。显示页面是这样的 - header()、body()、form()、footer() 和 body() 以及显示页面中的其他内容。
    • @user:我们需要查看您的模板类及其方法的实际代码。我们不是通灵者。
    • @user343934:如果您调用body() 两次,那么您肯定期望body() 的输出两次...
    【解决方案4】:

    我不确定我是否理解正确,但我相信你在问如何在另一个脚本中导入 template 类。 import 语句就是您所需要的:

    from index import template
    
    foo = template()
    
    foo.header()
    foo.body()
    foo.footer()
    

    【讨论】:

    • 这里有几个错别字,使您的答案完全荒谬。
    • @Sil:我的答案的第一次修订确实有很多错误。如果不是因为烦人的“你是人吗”功能,错别字会在您发表评论之前修复:)
    【解决方案5】:

    index.py 的顶部和底部有以下代码:

    cgitb.enable()
    print 'Content-type: text/html\n\n'
    print "<link rel=\"stylesheet\" type=\"text/css\" href=\"css/msa.css\" >"
    
    # [...]
    
    ## Calling all the functions of the class template with object (objx)
    objx=HtmlTemplate()
    # [...]      
    objx.CloseHtml()
    

    每次您import index时都会调用它。

    为了防止这种情况发生,把它放在一个块中:

    if __name__ == '__main__':
        cgitb.enable()
        print 'Content-type: text/html\n\n'
        print "<link rel=\"stylesheet\" type=\"text/css\" href=\"css/msa.css\" >"
    
        # [...]
    
        ## Calling all the functions of the class template with object (objx)
        objx=HtmlTemplate()
        # [...]      
        objx.CloseHtml()
    

    ...或者最好还是把这段代码函数放在,可以从其他地方调用。

    【讨论】:

    • 它似乎工作但仍然有一个错误,在 display.py 我收到“内容类型:文本/html”在顶部
    • 是的......该代码也被模块拉入。我已将其包含在修改后的答案中。
    • @user343934:是的,因为您应该将内容类型也放入 HTML-proper 语法中。
    【解决方案6】:

    以下解决方案对我有用:

    class1(unittest.TestCase):
       def method1(self)
    
    class2(unittest.TestCase):
       def method2(self):
          instance_name = class1("method1")
          instance_name.method1()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 2014-09-14
      • 1970-01-01
      • 2021-03-21
      • 1970-01-01
      • 2021-10-02
      相关资源
      最近更新 更多