继承和导入
Inheritance and imports
这是我在 Whosebug 中的第一个问题,所以如果我犯了一两个错误,请让我现在。另外,我不是以英语为母语的人,所以也要为一些语法错误做好准备。
问题是我完全是个新手,我正在通过 python 和 javascript 学习编程。现在我已经涵盖了要点,我正在 python 中试验我的第一个应用程序,所以这是我第一次练习模块、继承等。我对 [= 的导入有一些疑问39=] 通过各种模块:
- 我写了一个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...
- 我有一个模块,比如说,有 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
语句放在文件的开头。
你可以把import
s放在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.f1
,m2.f2
就能找到m1.f1
由于 m2.py
.
中的 import
语句
这是我在 Whosebug 中的第一个问题,所以如果我犯了一两个错误,请让我现在。另外,我不是以英语为母语的人,所以也要为一些语法错误做好准备。
问题是我完全是个新手,我正在通过 python 和 javascript 学习编程。现在我已经涵盖了要点,我正在 python 中试验我的第一个应用程序,所以这是我第一次练习模块、继承等。我对 [= 的导入有一些疑问39=] 通过各种模块:
- 我写了一个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...
- 我有一个模块,比如说,有 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
语句放在文件的开头。
你可以把import
s放在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.f1
,m2.f2
就能找到m1.f1
由于 m2.py
.
import
语句