web-dev-qa-db-fra.com

Différence entre Module et Class dans Python

Puis-je attribuer une valeur à une variable du module? Si oui, quelle est la différence entre une classe et un module?.

PS: Je suis un gars Java. Au cas où cela aiderait à expliquer. Merci.

23
liwevire
  • Module :

    Un module est un fichier contenant Python définitions et instructions.

Comme le doc dire.

Ainsi, un module des python est simplement un moyen d’organiser le code et il contient soit python des classes, soit uniquement des fonctions. Si vous avez besoin de ces classes ou fonctions dans votre projet, vous ne faites que import.Par exemple, le module math dans python contient uniquement un ensemble de fonctions et vous appelez simplement celles dont vous avez besoin (math.sin). Jetez un coup d'œil à ceci question .

D'autre part, une classe python est similaire à une classe Java, elle n'est structurée que d'une manière légèrement différente.

15

Il y a énorme différences entre les classes et les modules en Python.

Les classes sont des plans qui vous permettent de créer des instances avec des attributs et des fonctionnalités liées. Les classes prennent en charge l'héritage, les métaclasses et les descripteurs.

Les modules ne peuvent rien faire de cela, les modules sont essentiellement instances singleton d'une classe interne module, et tous leurs globaux sont des attributs de l'instance module. Vous pouvez manipuler ces attributs si nécessaire (ajouter, supprimer et mettre à jour), mais sachez qu'ils constituent toujours l'espace de nom global pour tout le code défini dans ce module.

A partir d'une perspective Java, les classes ne sont pas si différentes ici. Les modules peuvent contenir plus d'une classe cependant; les fonctions et le résultat de toute autre = Python expression peut aussi être globale dans un module.

Donc, à titre de directive générale sur le stade approximatif:

  • Utilisez des classes comme plans pour les objets qui modélisent votre domaine problématique.
  • Utilisez des modules pour regrouper les fonctionnalités en unités logiques.

Puis stockez les données lorsque cela convient à votre application. L'état global va dans les modules (et les fonctions et les classes sont autant d'état global, chargé au début). Tout le reste va dans d'autres structures de données, y compris des instances de classes.

24
Martijn Pieters

Puis-je affecter une valeur à une variable du module?
En bref oui.


Le concept de module fait référence à un seul fichier Python pouvant être importé (en important, vous avez accès aux variables/méthodes/classes définies dans ce module).

Il est couramment discuté avec le concept package, qui est un dossier avec __init__.py. Un package peut contenir des sous-packages ou des modules et, parallèlement, similaire aux modules, peut définir des variables/méthodes/classes à importer dans son __init__.py.

Le but d'avoir des modules/packages dans Python est un peu similaire à celui d'avoir des packages en Java: contenir et catégoriser les codes réutilisables, résoudre les conflits de nommage, etc.


De plus, Python a également une classe intégrée nommée module, tout comme list, Tuple, dict (notez que Python ne respectent pas la convention de dénomination de CapWords.) Une instance module représente le module/package importé.

Lorsque vous utilisez l'instruction import pour importer un module (fichier Python)) ou un package (dossier contenant __init__.py), typiquement
1. une nouvelle instance de module class sera créée
2. les classes/méthodes/variables que vous avez définies dans ce fichier importé Python sera ajouté comme attributs de cette instance module (ce sera un package, ce seront les classes/méthodes/variables définies dans __init__.py qui sont ajoutés).

Par conséquent, puisqu'il ne s'agit que d'une instance de module class, vous pouvez affecter une valeur à l'attribut de cette instance et à d'autres opérations d'instance de classe.

import math

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

console:

<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
royl8

Voici comment je décide d'organiser mon code en classes ou modules:

Class est censé être un modèle permettant de créer (plusieurs) instances d'objets à partir de ce modèle. De plus, les classes peuvent avoir des sous-classes (héritage).

Par conséquent, si j'ai besoin d'héritage ou de (nombreuses) instanciations, je rassemble des fonctions et des variables dans une définition de classe (méthodes et propriétés).

Sinon, je le garde simple et stupide (KISS) et utilise des modules.

Une bonne indication d'une mauvaise classe (cela aurait dû être un module): vous pouvez réécrire toutes vos méthodes et propriétés d'objet avec des méthodes de classe et des propriétés de classe.

0
Ali Khosro