Python中模块和类之间的区别

liw*_*ire 24 python class python-module

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

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

Mar*_*ers 25

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

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

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

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

所以作为一般的球场指南:

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

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

  • 从 java 到 python 我一直在努力掌握一些概念,我一直试图将所有东西都与 java 联系起来。这对澄清我的误解很有帮助。 (2认同)

Leo*_*ivì 15

  • 模块:

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

正如医生所说.

所以python中的模块只是一种组织代码的方式,它包含python类或只是函数.如果您需要项目中的那些类或函数,那么就是import它们.例如,mathpython中的模块只包含一堆函数,你只需要调用那些需要的函数(math.sin).看看这个问题吧.

另一方面,python类类似于java类,它只是以稍微不同的方式构造.


roy*_*yl8 7

我可以为模块中的变量赋值吗?
总之是的。


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

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

在 Python 中拥有模块/包的目的有点类似于在 Java 中拥有包:包含和分类可重用的代码,解决命名冲突等。


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

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

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

import math

print(type([1,2,3]))
print(type(math))
print(dir([1,2,3]))
print(dir(math))
Run Code Online (Sandbox Code Playgroud)

安慰:

<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']
Run Code Online (Sandbox Code Playgroud)


Ali*_*sro 5

在 python 世界中,modulepython.py 文件中的一个文件 (.py) package。包是一个文件夹,__init__.py在其根目录中。这是一种物理组织代码的方法(在文件和文件夹中)。

另一方面,class是一种抽象,它收集data(特征)和method(行为)定义来表示特定类型的对象。这是一种以逻辑方式组织代码的方法。

一个模块可以有零个或一个或多个类。一个类可以在一个或多个 .py 文件(模块)中实现。

但通常,我们可以将一组变量和函数组织到一个类定义中,或者只是简单地将它们放在一个 .py 文件中并将其称为模块。

同样,在系统设计中,您可以进行复杂的逻辑建模,也可以跳过它直接进入物理建模。但是对于非常复杂的系统,最好不要跳过逻辑建模。对于更简单的系统,请转到 KISS。

如何组织你的代码

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

类应该是基于该蓝图创建(许多)对象实例的蓝图。此外,类可以有子类(继承)。

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

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

一个糟糕的类(应该是一个模块)的一个很好的迹象:你可以object methods and propertiesstatic methods and properties.