【问题标题】:Little confused with import python对导入 python 有点困惑
【发布时间】:2013-06-19 17:28:03
【问题描述】:

我来自 PHP(以及一堆其他东西)背景,我正在玩 Python。在 PHP 中,当我想包含另一个文件时,我只需执行 includerequire 并包含该文件中的所有内容。

但似乎推荐的在 python 中做事的方法是from file import,但这似乎更适合包含库和东西?你如何将你的代码分成几个文件?唯一的方法是拥有一个包含一大堆函数调用的文件,然后导入其他 15 个文件吗?

【问题讨论】:

  • 我没有回答你的问题,因为它不是 100% 清楚,我可能最终会回答一个不同的问题,但你应该阅读__init__.py 文件和__all__ 模块-级别变量。
  • 您认为从文件中“包含”内容和从该文件中“导入”它们之间有什么不同?
  • 我做到了,这是一种通过使用包将多个 import 语句组合成一个语句的方法。但是,假设我不希望主 python 文件有 15 个函数调用,我希望 main.py 有 7 个,而 child.py 有 8 个。并且 main.py 将在某个行号处包含 child.py 来填充在那个地方将 child.py 的内容放入 main.py 中。就像 php 的工作原理一样。我就是这么想的……也许我想错了?
  • 问题是,您为什么觉得有必要这样做?为什么在“那个地方”包含这些功能很重要?您只需在开始时导入您需要的东西,然后在需要时使用它们。你能给出一个你遇到问题的实际代码示例吗?
  • 也许推荐的方法是让一个函数调用其他函数,然后调用其他函数等等?

标签: python python-2.7 import module


【解决方案1】:

PHP 和 Python 完全不同,原因有很多。

但似乎推荐的在 python 中做事的方法是from file import,但这似乎更适合包含库和东西?

确实,import 语句用于将对象从另一个模块导入到当前模块。您可以将导入模块的所有对象导入到当前模块:

import foo

print foo.bar

或者你可以从那个模块中选择你想要的:

from foo import bar

print bar

更好的是,如果你导入一个模块两次,它只会被导入一次:

>> import foo as foo1
>> import foo as foo2
>> foo1 is foo2
True

你如何将你的代码在几个文件中分开?

你必须考虑你的代码......这就是所谓的软件设计,这里有一些规则:

  • 您永远不会在模块级别编写算法;而是让它成为一个函数,然后调用该函数
  • 您永远不会在模块级别实例化对象;你应该把它嵌入到函数中,然后调用那个函数
  • 如果您需要多个不同函数中的对象,请创建一个类并将该对象封装在该类中,然后在绑定到该类的函数中使用它(因此它们现在称为方法)

唯一的例外是当你想从命令行启动一个程序时,你追加:

if __name__ == "__main__":

在模块的末尾。我最好的建议是之后调用你的第一个函数:

if __name__ == "__main__":
    main()

唯一的方法是拥有一个包含一大堆函数调用的文件,然后导入其他 15 个文件吗?

这不是唯一的方法,但它是最好的方法。您将所有算法放入函数库和对象库中,然后完全将您需要的内容导入其他库等。这就是您创建整个可重用代码世界的方式,而无需重新发明轮子!所以忘记文件,想想包含对象的模块。

最后,我对你学习 python 的最佳建议是忘掉你在编写 PHP 时的每一个习惯和用法,并以不同的方式重新学习这些东西。最后,这只会让你成为更好的软件工程师。

【讨论】:

  • 我只是想澄清一下,如果我创建一个库,它将包含多个方法,那么它们不是嵌入在文件中吗?文件和模块之间到底有什么区别在我看来是一样的。
  • 模块是 Python 运行时考虑的逻辑单元,文件是操作系统考虑的逻辑单元。一个区别是模块也可以是目录(在__init__.py 中定义符号)。
【解决方案2】:

我想我明白你想说什么和要做什么。

这是来自 PHP 的随机包含示例:

文件 #1 - vars.php

<?php

$color = 'green';
$fruit = 'apple';

?>

文件 #2 - main.php

<?php

echo "A $color $fruit"; // A

include 'vars.php';

echo "A $color $fruit"; // A green apple

?>

第一个回显命令将只打印“A”字符串,因为它没有分配给变量的任何值。下一个 echo 将打印一个完整的字符串,这要归功于您之前的包含。

然而,Python 的“导入”会导入一个模块或它的一部分,因此您可以在当前模块中使用它。

这是一个python示例:

文件 1 - echo.py

    apple = 'apple'
    color = 'green'

文件 2 - main.py

import echo

def func():
    print "A "+echo.color+" "+echo.fruit

if __name__ == '__main__':
    func()

换句话说 - 你从一个模块导入一些功能,然后在你的另一个模块中使用它。

从编程标准或最佳实践来看,上面的示例并不是很好,但我认为它可以让您有所了解。

【讨论】:

    【解决方案3】:

    有趣的问题。如您所知,在 PHP 中,您可以使用 include 来分隔代码,它从字面上获取包含文件中的所有代码,并将其放在您调用 include 的任何位置。这对于编写 Web 应用程序很方便,因为您可以轻松地将页面分成几部分(例如页眉、导航、页脚等)。

    另一方面,Python 不仅仅用于 Web 应用程序。要重用代码,您必须依赖函数或古老的面向对象编程。 PHP 也有函数和面向对象的编程仅供参考。

    您在一个文件中编写函数和类,然后将其导入另一个文件。这使您可以访问函数或使用您在其他文件中定义的类。

    假设您在文件file1.py 中有一个名为foo 的函数。从file2.py,你可以写 import file1。然后,使用file1.foo() 调用 foo。或者,写from file1 import foo,然后你可以用foo() 调用foo。请注意,from 允许您直接调用 foo。有关更多信息,请查看 python 文档。

    【讨论】:

    • 我想我的问题的答案是,就像你使用的 PHP 不需要调用 include... 你只需导入并运行函数或你需要的任何地方。 PHP 版本可能将页眉/页脚/等分开并包含在它们的位置中。在那种情况下,您的位置内会有header() footer() 等?谢谢
    • @Steven:嗯,这没有意义,因为 Python 不是 HTML 模板语言。所以一开始就没有“斑点”。
    【解决方案4】:

    在技术层面上,Python 导入与 PHP 要求非常相似,因为它将执行导入的文件。但由于 Python 并非旨在最终生成 HTML 文件,因此您使用它的方式非常不同。

    通常,模块级别的 Python 文件根本不包含很多可执行代码,而是函数和类的定义。您将它们导入并用作库。

    因此,像 header() 和 footer() 这样的东西在 Python 中是没有意义的。这些只是功能。这样调用它们,它们生成的结果将被忽略。

    那么如何拆分 Python 代码?好吧,你把它分成函数和类,你把它们放到不同的文件中,然后导入。

    【讨论】:

      【解决方案5】:

      这里有一个execfile() 函数,它的功能与PHP 的include 模糊可比,但几乎可以肯定这是你不想做的事情。正如其他人所说,这只是 Python 中的不同模型和不同的编程需求。您的代码将从一个函数转到另一个函数,并且您放置它们的顺序并没有真正的区别,只要它们的顺序是您在使用它们之前定义事物的顺序。您只是不想像通常使用 PHP 那样得到某种有序文档,因此不需要。

      【讨论】:

        猜你喜欢
        • 2013-08-20
        • 1970-01-01
        • 1970-01-01
        • 2020-12-27
        • 2019-12-12
        • 1970-01-01
        • 2022-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多