モジュール内の変数に値を割り当てることはできますか。はいの場合、クラスとモジュールの違いは何ですか。
PS:私はJava guy。です。説明のために役立つ場合があります。ありがとう。
Pythonのクラスとモジュールにはhugeの違いがあります。
クラスは、属性とバインドされた機能を持つインスタンスを作成できる設計図です。クラスは、継承、メタクラス、および記述子をサポートします。
モジュールはこれを行うことができません。モジュールは本質的にシングルトンインスタンス内部module
クラスであり、それらのグローバルはすべてmodule
インスタンスの属性です。これらの属性は必要に応じて操作(追加、削除、更新)できますが、これらの属性は、そのモジュールで定義されているすべてのコードのグローバル名前空間を引き続き形成することを考慮してください。
Javaの観点から見ると、クラスはそれほど違いません。ただし、モジュールには複数のクラスを含めることができます。関数と他の任意のPython式はモジュール内のグローバルにすることもできます。
だから、一般的な球場のガイドラインとして:
次に、アプリケーションにとって意味のある場所にデータを保存します。グローバル状態はモジュールに入ります(関数とクラスはグローバル状態であり、開始時にロードされます)。他のすべては、クラスのインスタンスを含む他のデータ構造に入ります。
モジュール内の変数に値を割り当てることはできますか?
要するに、はい。
module
の概念は、インポート可能な単一のPythonファイルを指します(インポートすることで、そのモジュールで定義された変数/メソッド/クラスにアクセスできます)。
一般に、__init__.py
を持つフォルダーであるpackage
という概念と一緒に説明します。パッケージにはサブパッケージまたはモジュールを含めることができ、同時にモジュールと同様に、__init__.py
内にインポートする変数/メソッド/クラスを定義できます。
Pythonでモジュール/パッケージを使用する目的は、Javaでパッケージを使用することに似ています。再利用可能なコードを含めて分類し、名前の競合を解決するなどです。
また、Pythonには、module
、list
、Tuple
と同様に、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']
これが、クラスまたはモジュールでコードを整理する方法です。
クラスは、その設計図に基づいてオブジェクトの(多くの)インスタンスを作成する設計図であると想定されています。さらに、クラスはサブクラス(継承)を持つことができます。
したがって、継承または(多くの)インスタンス化が必要な場合は、クラス定義(メソッドとプロパティ)の下で関数と変数を収集します。
それ以外の場合は、シンプルで愚かな(KISS)を保ち、モジュールを使用します。
悪いクラス(モジュールであるはずだった)の良い指標:すべてのオブジェクトメソッドとプロパティをクラスメソッドとクラスプロパティで書き換えることができます。