web-dev-qa-db-ja.com

Pythonのモジュールとクラスの違い

モジュール内の変数に値を割り当てることはできますか。はいの場合、クラスとモジュールの違いは何ですか。

PS:私はJava guy。です。説明のために役立つ場合があります。ありがとう。

23
liwevire
  • モジュール

    モジュールは、Python定義とステートメントを含むファイルです。

doc のように。

したがって、pythonのモジュールはコードを整理するための単なる方法であり、pythonクラスまたは関数のみが含まれています。これらのクラスまたは関数が必要な場合あなたのプロジェクト、あなたはただimportそれら。例えば、pythonのmathモジュールはただのたくさんの関数を含み、あなたはそれらを必要なものだけ呼び出す(_math.sin_)。これをご覧ください question

一方、pythonクラスは、Javaクラスに似ていますが、わずかに異なる方法で構造化されています。

15

Pythonのクラスとモジュールにはhugeの違いがあります。

クラスは、属性とバインドされた機能を持つインスタンスを作成できる設計図です。クラスは、継承、メタクラス、および記述子をサポートします。

モジュールはこれを行うことができません。モジュールは本質的にシングルトンインスタンス内部moduleクラスであり、それらのグローバルはすべてmoduleインスタンスの属性です。これらの属性は必要に応じて操作(追加、削除、更新)できますが、これらの属性は、そのモジュールで定義されているすべてのコードのグローバル名前空間を引き続き形成することを考慮してください。

Javaの観点から見ると、クラスはそれほど違いません。ただし、モジュールには複数のクラスを含めることができます。関数と他の任意のPython式はモジュール内のグローバルにすることもできます。

だから、一般的な球場のガイドラインとして:

  • 問題ドメインをモデル化するオブジェクトの設計図としてクラスを使用します。
  • モジュールを使用して、機能を論​​理ユニットに収集します。

次に、アプリケーションにとって意味のある場所にデータを保存します。グローバル状態はモジュールに入ります(関数とクラスはグローバル状態であり、開始時にロードされます)。他のすべては、クラスのインスタンスを含む他のデータ構造に入ります。

24
Martijn Pieters

モジュール内の変数に値を割り当てることはできますか?
要するに、はい。


moduleの概念は、インポート可能な単一のPythonファイルを指します(インポートすることで、そのモジュールで定義された変数/メソッド/クラスにアクセスできます)。

一般に、__init__.pyを持つフォルダーであるpackageという概念と一緒に説明します。パッケージにはサブパッケージまたはモジュールを含めることができ、同時にモジュールと同様に、__init__.py内にインポートする変数/メソッド/クラスを定義できます。

Pythonでモジュール/パッケージを使用する目的は、Javaでパッケージを使用することに似ています。再利用可能なコードを含めて分類し、名前の競合を解決するなどです。


また、Pythonには、modulelistTupleと同様に、dictという名前の組み込みクラスもあります( Python従来の理由により、組み込みクラスはCapWordsの命名規則に従いません。)moduleインスタンスは、インポートされたモジュール/パッケージを表します。

importステートメントを使用してモジュール(単一Pythonファイル))またはパッケージ(__init__.pyを含むフォルダー)をインポートする場合、通常
1。 moduleクラスの新しいインスタンスが作成されます
2。インポートしたPythonファイルで定義したクラス/メソッド/変数は、このmoduleインスタンスの属性として追加されます(パッケージの場合は、classes/__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
royl8

これが、クラスまたはモジュールでコードを整理する方法です。

クラスは、その設計図に基づいてオブジェクトの(多くの)インスタンスを作成する設計図であると想定されています。さらに、クラスはサブクラス(継承)を持つことができます。

したがって、継承または(多くの)インスタンス化が必要な場合は、クラス定義(メソッドとプロパティ)の下で関数と変数を収集します。

それ以外の場合は、シンプルで愚かな(KISS)を保ち、モジュールを使用します。

悪いクラス(モジュールであるはずだった)の良い指標:すべてのオブジェクトメソッドとプロパティをクラスメソッドとクラスプロパティで書き換えることができます。

0
Ali Khosro