继承和导入

Inheritance and imports

这是我在 Whosebug 中的第一个问题,所以如果我犯了一两个错误,请让我现在。另外,我不是以英语为母语的人,所以也要为一些语法错误做好准备。

问题是我完全是个新手,我正在通过 python 和 javascript 学习编程。现在我已经涵盖了要点,我正在 python 中试验我的第一个应用程序,所以这是我第一次练习模块、继承等。我对 [= 的导入有一些疑问39=] 通过各种模块:

  1. 我写了一个class(例如Class_1)。然后我在另一个模块中写另一个 class (例如 Class_2)。 Class_2 继承自 Class_1。同时,我在 Class_1.__init__ 方法级别导入了另一个模块中的一些方法。当我写 Class_2 时,我必须在 __init__ 方法中再次导入在 Class_1 中导入的方法,或者继承也意味着在 Class_1 级别导入的方法?

示例:

class Class_1(object):
    def __init__(self, args):
    from Module_5.Module_A import method_x
    # Class definition...

class Class_2(Class_1):
    def __init__(self, args):
    from Module_5.Module_A import method_x again?
    # Class definition...
  1. 我有一个模块,比如说,有 10 个 classes 和 30 个方法。想象一下,我的两个 classes 需要来自另一个模块的相同方法(例如 method_x)(同样,在每个 class 的 __init__ 方法中)。如果我在模块级别而不是 class 级别导入方法,不使用 method_x 的 class 是否有一些性能影响?什么是'usual'或'more pythonic'方式(如果有这种想法的话),在模块级别或class级别导入方法当a)只有一个class 在模块中需要导入的方法并且当 b) 1 < [需要该方法的 class 的数量] < [模块中 class 的一小部分] 需要导入的方法?

通常不会在 class' 正文中导入名称。习惯是在文件顶部附近写导入语句

from Module_5.Module_A import method_x

class Class_1(object):
    # Class definition...

class Class_2(Class_1):
    # Class definition...

这样做没有显着的性能优势或损失。

正如 Gribouillis 所提到的,习惯上将所有 import 语句放在文件的开头。

可以imports放在class或者函数定义里面,但是没有意义,它让代码更难阅读,而且有这样做没有真正的好处。 (事实上​​ ,如果您的多个 classes 从同一模块导入,它可能会稍微 less 效率,因为您不必要地给解释器更多的工作要做,但是这没什么大不了的,因为解释器总是在尝试从磁盘读取模块之前检查模块是否已经加载。

此规则的一个小例外是,当文件设计为既作为模块导入又作为命令行脚本直接 运行 时,您的代码仅获得 运行。这些文件通常会有

if __name__ == '__main__':
末尾的

部分用于当文件作为脚本 运行 时仅获取 运行 的代码。该代码可能需要一个其他代码不需要的模块(例如 argparse)。在那种情况下,可以将此类额外的导入放在该部分的顶部而不是文件的顶部。


你是否

import Module_5.Module_A

from Module_5.Module_A import method_x

导入了整个Module_5.Module_A模块,不同之处在于第一种形式将名称Module_5.Module_A添加到您的命名空间,第二种形式将名称method_x添加到你的命名空间。当您只需要模块中的几个名称时,执行 from 导入是可以的,但这会使代码更难阅读,因为您无法仅通过查看名称来判断它的来源。所以通常做一些像

这样的事情会更好
import Module_5.Module_A as m5A

然后您可以像这样访问它的名称:

m5A.method_x

这样就很明显 method_x 来自 m5A.


您问的是:"When I write Class_2, I have to import again the methods imported in Class_1 or the inheritance implies also the methods imported at the Class_1 level?"。是的,您不需要显式导入第一个模块,除非您想直接访问它的名称。让我用一个更简单的例子来说明。

假设我们有 3 个模块。

m1.py

def f1(x):
    return x

m2.py

import m1

def f2(x):
    return m1.f1(x) * 2

m3.py

import m2

def f3(x):
    return m2.f2(x) * 3

print(f3(1))

可以看到,m3.py不需要导入m1.py,除非你想直接访问m1.f1m2.f2就能找到m1.f1 由于 m2.py.

中的 import 语句