【问题标题】:Python OOP - Should def main() be outside of any class in a .py file?Python OOP - def main() 是否应该在 .py 文件中的任何类之外?
【发布时间】:2017-08-25 20:05:15
【问题描述】:

关于 OOP,尤其是 Python,我有一个问题。假设我有,例如,priorities.py - 一个简单的 GUI 程序来管理优先级,它有三个类:Priority、Client、GuiPart:

# priorities.py
#   GUI program to manage priorities

from tkinter import *

class Priority:
    pass

class GuiPart:
    def __init__(self):
        self.root = self.createWindow()

    def createWindow(self):

        root = Tk()
        root.resizable(width = False, height = False)
        root.title("Priorities")

        return root

    def display(self):

        Label(self.root,
              text = "testes").grid(row = 0, column = 1)

class Client:
    pass

def main():
    g = GuiPart()
    g.display()
    root = g.root.mainloop()

main()

我应该把 def main() 放在任何类之外,还是应该把它放在 Client 类中?

【问题讨论】:

  • 我不确定风格指南是怎么说的(或其他人的想法),但我个人不使用def main(),我使用if __name__ == '__main__: 并将其放在底部任何类之外的文件(就像你正在做的那样)。
  • 除非你的代码不起作用或者你想提高它的效率,这个问题更适合代码审查。
  • @RocketHazmat 将main 定义为函数也可以更轻松地测试该代码。
  • @RocketHazmat def main():if __name__ == '__main__: 并不相互排斥。 if __name__ == '__main__: main() 很常见,正如 @chepner 所说,让在其他地方测试 main 变得容易。
  • @wraith46 Rocket Hazmat 说他不使用main(),他使用if __name__。我是说这不是非此即彼;您可以将所有 main 功能放在一个函数中,然后从 if __name__ 调用该函数

标签: python oop


【解决方案1】:

我的首选方法:

使用if __name__ == '__main__': 指令分隔主文件

原因:

  1. 应用逻辑和调用逻辑是分开的。这样您就可以轻松扩展
  2. 可以有效地维护和应用不同的环境设置。因此,我们可以在 dev/test/stage/prod 设置之间无缝转换
  3. 也提高了代码的可读性

【讨论】:

  • 对不起,我不太明白,name 是什么名字? .py 文件?
  • 它在 python 中是一个神奇的词。这将反映文件名,因此当您直接运行 py 文件 ex.. (xyz.py) 时,它会理解这是起始调用点,因此在此块中写入的任何内容都将被执行.. 其余时间不会.. 更多关于此stackoverflow.com/questions/419163/what-does-if-name-main-do
  • 换句话说,它是一种指定只应在脚本作为脚本执行时运行的代码的方法,而不是当您从另一个脚本(或另一个模块)将其作为模块导入时。您可能不希望您的脚本被导入,但这就是大多数(如果不是全部)测试框架访问您的代码以运行测试的方式。
  • @wraith46 不客气。如果您认为答案消除了您的疑虑,您可以将答案标记为已接受。
【解决方案2】:

每个模块(python文件)都有一个内置的__name__变量,如果这等于"__main__"这意味着这个文件直接运行,但如果__name__等于其他东西这意味着当前文件导入到其他python 文件。

如果你直接运行这个文件或者作为模块运行这个文件,你可以使用__name__变量来识别使用的代码文件的类型,类似如下:

# Some codes
if __name__ == '__main__':
    main()

现在用户可以直接运行这个文件和/或程序员可以在其他代码中使用这个模块而不用运行main()函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多