Разница между модулем и классом в Python

Можно ли присвоить значение переменной в модуле. Если да, в чем разница между классом и модулем.

PS: Я парень из java. В случае, если это помогает в объяснении. Спасибо.

Ответ 1

  • Модуль:

    Модуль - это файл, содержащий определения и инструкции Python.

Как говорится в doc.

Таким образом, модуль в python - это просто способ организовать код, и он содержит либо классы python, либо просто функции. Если вам нужны эти классы или функции в вашем проекте, вы просто import их. Например, модуль math в python содержит только кучу функций, и вы просто вызываете их (math.sin). Просто посмотрите на этот вопрос.

С другой стороны, класс python похож на класс java, он только структурирован несколько иначе.

Ответ 2

В Python существуют огромные различия между классами и модулями.

Классы - это чертежи, которые позволяют создавать экземпляры с атрибутами и связанными функциями. Классы поддерживают наследование, метаклассы и дескрипторы.

Модули не могут ничего сделать, модули по сути являются одноэлементными экземплярами внутреннего класса module, и все их глобальные переменные являются атрибутами экземпляра module. Вы можете манипулировать этими атрибутами по мере необходимости (добавлять, удалять и обновлять), но учитывать, что они все еще образуют глобальное пространство имен для всего кода, определенного в этом модуле.

С точки зрения Java, здесь не все классы. Однако модули могут содержать не только один класс; функции и любой результат любого другого выражения Python могут быть глобальными в модуле тоже.

Итак, как общий ориентир шара:

  • Используйте классы в качестве чертежей для объектов, которые моделируют ваш проблемный домен.
  • Используйте модули для сбора функциональности в логических единицах.

Затем сохраните данные, если это имеет смысл для вашего приложения. Глобальное состояние идет в модулях (а функции и классы - это такое же глобальное состояние, загруженное в начале). Все остальное относится к другим структурам данных, включая экземпляры классов.

Ответ 3

Можно ли присвоить значение переменной в модуле?
Короче да.


Концепция 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))

Приставки:

<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']

Ответ 4

Вот как я решаю организовать свой код в классах или модулях:

Предполагается, что класс является планом для создания (множества) экземпляров объектов на основе этого плана. Более того, классы могут иметь подклассы (наследование).

Поэтому, если мне нужно наследование или (много) экземпляры, я собираю функции и переменные в соответствии с определением класса (методы и свойства).

В противном случае я сохраняю это простым и глупым (KISS) и использую модули.

Хороший признак плохого класса (который должен был быть модулем): вы можете переписать все свои методы и свойства объекта с помощью методов класса и свойств класса.