我在python中编写代码并且遇到了疑问。似乎无关紧要,但无法克服它。问题是当我导入模块并按如下方式使用它时:
import math
print math.sqrt(9)
在这里,我将math(module)视为具有方法sqrt()的类。如果是这种情况,那么我怎样才能直接使用该类而不创建它的对象。我基本上无法理解类和对象之间的抽象。
答案 0 :(得分:1)
模块更像是对象,而不是类。你没有"实例化"一个模块,每个模块只有一个实例,您可以使用import语句访问它。
具体来说,模块是'模块':
类型的对象>>> import math
>>> type(math)
<type 'module'>
每个模块都将有一组不同的变量和方法。
只要首次导入模块,就会由Python实例化模块。已实例化的模块存储在sys.modules
:
>>> import sys
>>> 'math' in sys.modules
False
>>> import math
>>> 'math' in sys.modules
True
>>> sys.modules['math'] is math
True
答案 1 :(得分:1)
AFAIK所有python模块(如数学和数百万)在导入时都会被实例化。他们问了多少次你实例化?就一次!所有模块都是单身。
只是说上述说法不够充分,所以让我们深入研究它。 创建一个python模块(模块基本上是以&#34; .py&#34;扩展名结尾的任何文件)说&#34; p.py&#34;包含一些代码如下:
In p.py
print "Instantiating p.py module. Please wait..."
# your good pythonic optimized functions, classes goes here
print "Instantiating of p.py module is complete."
并在q.py中尝试导入
import p
当你运行q.py时,你会看到..
Instantiating p.py module. Please wait...
Instantiating of p.py module is complete.
现在你创建了它的实例吗?没有!但是你仍然准备好使用它。
答案 2 :(得分:0)
在您的情况下math
不是一个类。当import math
导入整个模块math
时。你可以看到它像包含一个库(它的概念)
如果您想避免导入整个模块(为了不包含程序中的所有内容),您可以执行以下操作:
from math import sqrt
print sqrt(9)
这种方式只导入sqrt
而不是math
模块中的所有内容。
答案 3 :(得分:0)
在此,我将
math(module)
视为具有方法sqrt()
的类。如果是这种情况,那么我怎样才能直接使用该类而不创建它的对象。我基本上无法理解类和对象之间的抽象。
导入模块时,会创建模块对象。就像使用open('file.txt')
时一样,将创建一个文件对象。
您可以通过引用类名来使用类而不从中创建对象:
class A:
value = 2 + 2
A.value
class A
是类type
的对象 - 用于创建类的内置类。 Python中的所有东西都是一个对象。
当您致电课程A()
时,您将如何创建对象。 *有时候对象是由像import
之类的语句创建模块对象创建的,def
创建一个函数对象,class
创建一个创建其他对象的类对象和许多其他语句......