Python 中模块与 Class 的区别
Difference between Module and Class in Python
我可以为模块中的变量赋值吗?如果是,a class 和 module 有什么区别?
PS:我是 Java 人(以防它有助于解释)。谢谢
模块:
A module is a file containing Python definitions and statements.
如doc所说。
因此 python 中的模块只是一种组织代码的方式,它包含 python classes 或仅包含函数。
如果您的项目中需要那些 classes 或函数,您只需 import
它们。
例如,python 中的 math
模块只包含一堆函数,您只需调用那些需要的函数 (math.sin
)。
看看这个 question.
另一方面,python class 与 java class 类似,只是结构略有不同。
classES 和 Python 中的模块之间存在 巨大 差异。
类 是允许您创建具有属性和绑定功能的实例的蓝图。 类 支持继承、元classes 和描述符。
模块不能做任何这些,模块本质上是内部 module
class 的 单例实例 ,并且它们的所有全局变量都是属性module
实例。您可以根据需要操作这些属性(添加、删除和更新),但请注意,这些属性仍然构成该模块中定义的所有代码的全局命名空间。
从 Java 的角度来看,class 这里并没有什么不同。但是,模块可以包含多个 class;函数和任何其他 Python 表达式的任何结果也可以是模块中的全局变量。
所以作为一般的大概指南:
- 使用 classes 作为对您的问题域建模的对象的蓝图。
- 使用模块将功能收集到逻辑单元中。
然后将数据存储在对您的应用程序有意义的地方。全局状态进入模块(函数和 classes 与全局状态一样多,在开始时加载)。其他一切都进入其他数据结构,包括 classes.
的实例
我可以为模块中的变量赋值吗?
总之是的。
module
的概念是指可以导入的单个 Python 文件(通过导入,您可以访问该模块中定义的 variables/methods/classes)。
通常和package
这个概念一起讨论,也就是带__init__.py
的文件夹。一个包可以包含子包或模块,同时,类似于模块,可以在其__init__.py
中定义variables/methods/classes被导入。
在Python中加入modules/packages的目的有点类似于在Java中加入包:包含和分类可重用的代码,解决命名冲突等等。
此外,Python还有一个名为module
的内置class,就像list
、tuple
、dict
一样(注意Python 内置 classes 由于遗留原因不遵循 CapWords 命名约定)。 module
实例表示导入的 module/package。
当您使用 import
语句导入模块(单个 Python 文件)或包(带有 __init__.py
的文件夹)时,通常
1. module
class 的新实例将被创建
2. 你在那个导入的Python文件中定义的classes/methods/variables将被添加为这个module
实例的属性(如果它是一个包,它将是classes/methods/variables定义的在 __init__.py
中添加)。
因此,由于它只是module
class的实例,您可以为该实例的属性和其他class实例操作赋值。
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']
在 python 世界中,module
是 package
中的 python
文件 (.py)。包是一个文件夹,其根目录为 __init__.py
。这是一种物理(在文件和文件夹中)组织代码的方法。
另一方面,class
是一种抽象,它收集了 data
(特征)和 method
(行为)定义来表示特定类型的对象。这是一种逻辑.
组织代码的方法
一个模块可以有零个或一个或多个 classes。一个class可以在一个或多个.py文件(模块)中实现。
但通常,我们可以将一组变量和函数组织成一个 class 定义,或者只是简单地将它们放在一个 .py 文件中并将其称为模块。
同样在系统设计中,您可以进行复杂的逻辑建模,也可以跳过它直接进入物理建模。但是对于非常复杂的系统,最好不要跳过逻辑建模。对于更简单的系统,请使用 KISS。
如何组织代码
这就是我决定在 classes 或模块中组织代码的方式:
Class 应该是基于该蓝图创建(许多)对象实例的蓝图。而且,classes可以有sub-classes(继承)。
因此,如果我需要继承或(许多)实例化,我会在 class 定义(方法和属性)下收集函数和变量。
否则,我保持简单和愚蠢 (KISS) 并使用模块。
一个坏 class 的良好指示(应该是一个模块):你可以用 static methods and properties
.
重写你所有的 object methods and properties
就像一个概念:模块 > Class > Python 中的函数。这是在单元测试工具中使用此想法的示例,Pytest about Fixture Scope across Classes, Modules。
我可以为模块中的变量赋值吗?如果是,a class 和 module 有什么区别?
PS:我是 Java 人(以防它有助于解释)。谢谢
模块:
A module is a file containing Python definitions and statements.
如doc所说。
因此 python 中的模块只是一种组织代码的方式,它包含 python classes 或仅包含函数。
如果您的项目中需要那些 classes 或函数,您只需 import
它们。
例如,python 中的 math
模块只包含一堆函数,您只需调用那些需要的函数 (math.sin
)。
看看这个 question.
另一方面,python class 与 java class 类似,只是结构略有不同。
classES 和 Python 中的模块之间存在 巨大 差异。
类 是允许您创建具有属性和绑定功能的实例的蓝图。 类 支持继承、元classes 和描述符。
模块不能做任何这些,模块本质上是内部 module
class 的 单例实例 ,并且它们的所有全局变量都是属性module
实例。您可以根据需要操作这些属性(添加、删除和更新),但请注意,这些属性仍然构成该模块中定义的所有代码的全局命名空间。
从 Java 的角度来看,class 这里并没有什么不同。但是,模块可以包含多个 class;函数和任何其他 Python 表达式的任何结果也可以是模块中的全局变量。
所以作为一般的大概指南:
- 使用 classes 作为对您的问题域建模的对象的蓝图。
- 使用模块将功能收集到逻辑单元中。
然后将数据存储在对您的应用程序有意义的地方。全局状态进入模块(函数和 classes 与全局状态一样多,在开始时加载)。其他一切都进入其他数据结构,包括 classes.
的实例我可以为模块中的变量赋值吗?
总之是的。
module
的概念是指可以导入的单个 Python 文件(通过导入,您可以访问该模块中定义的 variables/methods/classes)。
通常和package
这个概念一起讨论,也就是带__init__.py
的文件夹。一个包可以包含子包或模块,同时,类似于模块,可以在其__init__.py
中定义variables/methods/classes被导入。
在Python中加入modules/packages的目的有点类似于在Java中加入包:包含和分类可重用的代码,解决命名冲突等等。
此外,Python还有一个名为module
的内置class,就像list
、tuple
、dict
一样(注意Python 内置 classes 由于遗留原因不遵循 CapWords 命名约定)。 module
实例表示导入的 module/package。
当您使用 import
语句导入模块(单个 Python 文件)或包(带有 __init__.py
的文件夹)时,通常
1. module
class 的新实例将被创建
2. 你在那个导入的Python文件中定义的classes/methods/variables将被添加为这个module
实例的属性(如果它是一个包,它将是classes/methods/variables定义的在 __init__.py
中添加)。
因此,由于它只是module
class的实例,您可以为该实例的属性和其他class实例操作赋值。
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']
在 python 世界中,module
是 package
中的 python
文件 (.py)。包是一个文件夹,其根目录为 __init__.py
。这是一种物理(在文件和文件夹中)组织代码的方法。
另一方面,class
是一种抽象,它收集了 data
(特征)和 method
(行为)定义来表示特定类型的对象。这是一种逻辑.
一个模块可以有零个或一个或多个 classes。一个class可以在一个或多个.py文件(模块)中实现。
但通常,我们可以将一组变量和函数组织成一个 class 定义,或者只是简单地将它们放在一个 .py 文件中并将其称为模块。
同样在系统设计中,您可以进行复杂的逻辑建模,也可以跳过它直接进入物理建模。但是对于非常复杂的系统,最好不要跳过逻辑建模。对于更简单的系统,请使用 KISS。
如何组织代码
这就是我决定在 classes 或模块中组织代码的方式:
Class 应该是基于该蓝图创建(许多)对象实例的蓝图。而且,classes可以有sub-classes(继承)。
因此,如果我需要继承或(许多)实例化,我会在 class 定义(方法和属性)下收集函数和变量。
否则,我保持简单和愚蠢 (KISS) 并使用模块。
一个坏 class 的良好指示(应该是一个模块):你可以用 static methods and properties
.
object methods and properties
就像一个概念:模块 > Class > Python 中的函数。这是在单元测试工具中使用此想法的示例,Pytest about Fixture Scope across Classes, Modules。