来自Dynamic linking in C/C++ (dll) vs JAVA (JAR)
当我想在另一个项目中使用此jar文件时,我们使用“ package”或“ import”关键字
您不必。这只是一个短手。您可以使用完整
package.ClassName
,并且不需要import
。注意:这个 不导入任何代码或数据,仅允许您使用较短的名称 上课。例如之间没有区别
java.util.Date date = new java.util.Date();
和
import java.util.Date(); Date date = new Date(); // don't need to specify the full package name.
Python3中的import
是否也是如此?
我们可以使用模块中定义的标识符而不导入其模块吗?为了实现这一目标,我是否想念以下内容?
Java和Python的import
有什么区别?
>>> random.randint(1,25)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'random' is not defined
>>> import random
>>> random.randint(1,25)
18
答案 0 :(得分:0)
简短的回答:不,您不能使用完全限定的名称在Python中隐式导入模块。
答案略长:
在Python中,导入模块可能会有副作用:模块可以具有模块级代码,而不必将其所有代码包装在函数或类中。因此,将模块导入任意和意外的位置可能会造成混淆,因为在您不期望它们时会触发这些副作用。
推荐的样式(有关详细信息,请参见https://www.python.org/dev/peps/pep-0008/)是将所有导入都放在模块的顶部,而不要将导入隐藏在意外的地方。
答案 1 :(得分:0)
Python不是Java。在Python中,您只能访问在当前作用域或其父作用域中内建或定义的名称-“顶层”作用域是模块名称空间(又称为“全局”名称空间)。
import语句(这是可执行语句FWIW)执行两件事:首先加载模块(实际上每个进程仅发生一次,然后将模块缓存在sys.modules
中),然后绑定导入的名称( s)在当前范围内。 IOW:
import foo
是语法糖
foo = __import__("foo")
和
from foo import bar
是语法糖
foo = __import__("foo")
bar = getattr(foo, "bar")
del foo
此外,您还必须了解“加载模块”的真正含义:在模块的顶层执行所有代码。
正如我提到的,import
是一个可执行语句,class
和def
也是如此-def
语句从函数的{正文和签名,然后使用此代码对象创建一个code
对象,最后将此函数对象绑定到当前作用域中的函数名称,function
语句对一个类执行相同的操作(执行所有临时命名空间中“类”语句顶层的代码,并使用该命名空间创建“类”对象,然后将类对象绑定到其名称)。
IOW,所有操作都在运行时发生,一切都是对象(包括函数,类和模块),并且您使用class
,import
或class
语句所做的一切都可以完成也“手动”(虽然或多或少很容易-手动创建函数是一个相当复杂的过程)。
因此,如您所见,这实际上与Java或C ++的工作方式无关。