これが何百万人もの初心者から寄せられた質問ではないことを心から願っていますが、私の検索では満足のいく答えが得られませんでした.
だから私の質問はかなり簡単です。クラスは基本的に、独自の名前空間を持つ関数のコンテナーですか? 別の名前空間を提供し、関数を保持しながらクラス属性として呼び出し可能にする以外に、他にどのような関数がありますか? Pythonのコンテキストで質問しています。
ああ、あなたのほとんどの大きな助けに感謝します!
たとえば、これは適度に役立つクラスです。Python ファイル ( で作成open
) は自分の名前を覚えていないので、名前を覚えるファイル クラスを作成しましょう。
class NamedFile(object):
def __init__(self, name):
self._f = f
self.name = name
def readline(self):
return self._f.readline()
Python にクラスがなかったら、代わりに dict を使っていたでしょう:
def open_file(name):
return {"name": name, "f": open(name)}
言うまでもなく、myfile["f"].readline()
ずっと電話していると、ある時点で指が痛くなります。readline
もちろん、NamedFile
モジュール (名前空間) に関数を導入することもできますが、その場合は常にその正確な関数を使用する必要があります。対照的に、NamedFile
インスタンスはメソッドを持つオブジェクトが必要な場所ならどこでも使用できるため、多くの状況でreadline
プラグインの代わりになります。file
これはポリモーフィズムと呼ばれ、OO/クラスベース プログラミングの最大の利点の 1 つです。
(また、dict
クラスであるため、それを使用すると、クラスが存在しないという仮定に違反します:)
ほとんどの言語では、クラスはオブジェクトの生成方法を記述した単なるコードです。それはPythonにも当てはまります:
>>> class ObjectCreator(object):
... pass
...
>>> my_object = ObjectCreator()
>>> print my_object
<__main__.ObjectCreator object at 0x8974f2c>
しかし、Python ではクラスはそれ以上のものです。クラスもオブジェクトです。
はい、オブジェクト。
キーワード class を使用するとすぐに、Python はそれを実行し、OBJECT を作成します。命令:
>>> class ObjectCreator(object):
... pass
...
という名前のオブジェクトをメモリ内に作成しますObjectCreator
。
このオブジェクト (クラス) はそれ自体でオブジェクト (インスタンス) を作成できます。これがクラスである理由です。
それでも、それはオブジェクトであるため、次のようになります。
例えば:
>>> print ObjectCreator # you can print a class because it's an object
<class '__main__.ObjectCreator'>
>>> def echo(o):
... print o
...
>>> echo(ObjectCreator) # you can pass a class as a parameter
<class '__main__.ObjectCreator'>
>>> print hasattr(ObjectCreator, 'new_attribute')
False
>>> ObjectCreator.new_attribute = 'foo' # you can add attributes to a class
>>> print hasattr(ObjectCreator, 'new_attribute')
True
>>> print ObjectCreator.new_attribute
foo
>>> ObjectCreatorMirror = ObjectCreator # you can assign a class to a variable
>>> print ObjectCreatorMirror.new_attribute
foo
>>> print ObjectCreatorMirror()
<__main__.ObjectCreator object at 0x8997b4c>
クラス (またはオブジェクト) は、データのカプセル化と、そのデータに対して実行できる操作を提供するために使用されます。
それらは Python 自体で名前空間を提供しません。モジュールのインポートは同じタイプのものを提供し、モジュールはオブジェクト指向ではなく完全に機能することができます。
OOP With Python、Dive into Python、Chapter 5. Objects and Object Oriented Programming 、またはオブジェクト指向プログラミングに関するウィキペディアの記事だけでも、いくつかの利点が得られる場合があります。
クラスはオブジェクトの定義です。この意味で、クラスは一種の名前空間を提供しますが、それはクラスの真の目的ではありません。真の目的は、オブジェクトが「どのように見えるか」を定義することです。つまり、オブジェクトが実行できること (メソッド) と、オブジェクトが認識すること (プロパティ) を定義します。
私の答えは、比較的非技術的なレベルでの理解を提供することを目的としていることに注意してください。これは、クラスを理解する際の最初の問題でした。この質問には他にも多くの素晴らしい答えがあると確信しています。これがあなたの全体的な理解に役立つことを願っています。