Можно ли присвоить значение переменной в модуле. Если да, в чем разница между классом и модулем.
PS: Я парень из java. В случае, если это помогает в объяснении. Спасибо.
Можно ли присвоить значение переменной в модуле. Если да, в чем разница между классом и модулем.
PS: Я парень из java. В случае, если это помогает в объяснении. Спасибо.
Модуль:
Модуль - это файл, содержащий определения и инструкции Python.
Как говорится в doc.
Таким образом, модуль в python - это просто способ организовать код, и он содержит либо классы python, либо просто функции.
Если вам нужны эти классы или функции в вашем проекте, вы просто import
их.
Например, модуль math
в python содержит только кучу функций, и вы просто вызываете их (math.sin
).
Просто посмотрите на этот вопрос.
С другой стороны, класс python похож на класс java, он только структурирован несколько иначе.
В Python существуют огромные различия между классами и модулями.
Классы - это чертежи, которые позволяют создавать экземпляры с атрибутами и связанными функциями. Классы поддерживают наследование, метаклассы и дескрипторы.
Модули не могут ничего сделать, модули по сути являются одноэлементными экземплярами внутреннего класса module
, и все их глобальные переменные являются атрибутами экземпляра module
. Вы можете манипулировать этими атрибутами по мере необходимости (добавлять, удалять и обновлять), но учитывать, что они все еще образуют глобальное пространство имен для всего кода, определенного в этом модуле.
С точки зрения Java, здесь не все классы. Однако модули могут содержать не только один класс; функции и любой результат любого другого выражения Python могут быть глобальными в модуле тоже.
Итак, как общий ориентир шара:
Затем сохраните данные, если это имеет смысл для вашего приложения. Глобальное состояние идет в модулях (а функции и классы - это такое же глобальное состояние, загруженное в начале). Все остальное относится к другим структурам данных, включая экземпляры классов.
Можно ли присвоить значение переменной в модуле?
Короче да.
Концепция 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']
Вот как я решаю организовать свой код в классах или модулях:
Предполагается, что класс является планом для создания (множества) экземпляров объектов на основе этого плана. Более того, классы могут иметь подклассы (наследование).
Поэтому, если мне нужно наследование или (много) экземпляры, я собираю функции и переменные в соответствии с определением класса (методы и свойства).
В противном случае я сохраняю это простым и глупым (KISS) и использую модули.
Хороший признак плохого класса (который должен был быть модулем): вы можете переписать все свои методы и свойства объекта с помощью методов класса и свойств класса.