Python中模块和类之间的区别

时间:2017-04-03 11:16:39

标签: python class python-module

我可以为模块中的变量赋值吗?如果是,则类和模块之间有什么区别。

PS:我是个小家伙。如果它有助于解释。感谢。

4 个答案:

答案 0 :(得分:19)

Python中的类和模块之间存在巨大的差异。

类是蓝图,允许您创建具有属性和绑定功能的实例。类支持继承,元类和描述符。

模块不能执行任何操作,模块本质上是内部module类的单例实例,并且它们的所有全局变量都是module实例上的属性。您可以根据需要操作这些属性(添加,删除和更新),但要考虑到这些属性仍然构成该模块中定义的所有代码的全局命名空间。

从Java的角度来看,这里的类并没有那么不同。然而,模块可以包含多个类;函数和任何其他Python表达式的任何结果也可以是模块中的全局变量。

作为一般的球场指南:

  • 将类用作构建问题域的对象的蓝图。
  • 使用模块将功能收集到逻辑单元中。

然后将数据存储在对您的应用程序有意义的地方。全局状态进入模块(函数和类与全局状态一样,在开始时加载)。其他所有内容都会进入其他数据结构,包括类的实例。

答案 1 :(得分:15)

  • 模块

      

    模块是包含Python定义和语句的文件。

正如doc所说。

因此,python中的模块只是一种组织代码的方式,它包含python类或函数。 如果您需要项目中的这些类或函数,那么只需import它们。 例如,python中的math模块只包含许多函数,您只需调用所需的函数(math.sin)。 请看一下这个question

另一方面,python类类似于java类,它的结构只是略有不同。

答案 2 :(得分:3)

我可以为模块中的变量赋值吗?
简而言之,是的。

module的概念是指可以导入的单个Python文件(通过导入,您可以访问该模块中定义的变量/方法/类)。

通常与概念package一起讨论,__init__.py是一个__init__.py的文件夹。包可以包含子包或模块,同时,与模块类似,可以定义要在其module内导入的变量/方法/类。

在Python中使用模块/包的目的与在Java中使用包类似:包含和分类可重用代码,解决命名冲突等问题。

此外,Python还有一个名为list的内置类,就像tupledictmodule一样(请注意,Python内置类不遵循CapWords命名约定由于遗留原因)。 import实例表示导入的模块/包。

使用__init__.py语句导入模块(单个Python文件)或包(带module的文件夹)时,通常为 1.将创建module类的新实例 2.您在导入的Python文件中定义的类/方法/变量将作为此__init__.py实例的属性添加(如果它是一个包,它将是{{1}中定义的类/方法/变量已添加)。

因此,由于它只是module类的一个实例,因此可以为该实例的属性和其他类实例操作赋值。

import math

print(type([1,2,3]))
print(type(math))
print(dir([1,2,3]))
print(dir(math))

控制台:

<class 'list'>
<class 'module'>
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']

答案 3 :(得分:0)

这是我决定将代码组织在类或模块中的方式:

类应该是根据该蓝图创建(许多)对象实例的蓝图。而且,类可以具有子类并传递其基因(继承性)。模块和类都封装了方法和变量,并有助于代码重用。

因此,如果我想要的东西需要继承或(很多)实例化,我将在类定义(方法和属性)下收集函数和变量。

否则,我保持简单和愚蠢(KISS)并使用模块。

一个不好的类(应该是一个模块)的一个好兆头:您可以将方法重写为静态方法,并将变量重写为类属性。

相关问题