Pythonのクラスはどのようにobjectを継承するのか?
Pythonでは、クラスが組み込み型を基底クラス(ベースクラス)として持つかどうかによって、クラスのスタイルが異なります。ここでは、Python 2.xとPython 3.xにおけるobject継承の違いを解説します。
Python 2.x:2種類のクラススタイル
Python 2.xには、組み込み型を基底クラスとして持つかどうかに応じて、2つのスタイルのクラスが存在します。
旧スタイル(クラシック)クラス
旧スタイル、いわゆる「クラシック」クラスは、組み込み型を基底クラスとして持ちません。基底クラスを指定せずにクラスを定義すると、このスタイルになります。
>>> class OldFoo: # 基底クラスなし
... pass
>>> OldFoo.__bases__
()
__bases__属性を確認すると空のタプル()が返されることから、このクラスがobjectを継承していないことがわかります。
新スタイルクラス
新スタイルクラスは、組み込み型を基底クラスとして持ちます。つまり、直接的または間接的にobjectを基底クラスとするクラスです。
>>> class NewFoo(object): # objectから直接継承
... pass
>>> NewFoo.__bases__
(<type 'object'>,)
クラス名の後ろの括弧内にobjectを明示的に指定することで、新スタイルクラスとして定義されます。新スタイルクラスでは、プロパティやデスクリプタなど、より豊富な機能が利用可能になります。
Python 3.x:新スタイルクラスのみ
一方、Python 3.xでは新スタイルクラスのみが許可されており、すべてのクラスが必ず組み込み型objectを基底クラスとして持ちます。
そのため、Python 3.xではクラス宣言時にクラス名の後ろの括弧内でobjectを指定する必要はありません。クラスは暗黙的にobjectを継承します。
>>> class Foo: # 暗黙的にobjectを継承
... pass
>>> Foo.__bases__
(<class 'object'>,)
このように、Python 3.xでは何も指定しなくても__bases__にobjectが含まれており、すべてのクラスが統一されたオブジェクト階層の一部となっています。これにより、Python 2.x時代の新旧スタイル混在による問題が解消されました。
-
Pythonにおけるネストした文字クラスの減算の仕組みをわかりやすく解説
ネストした文字クラスの減算とは 文字クラスの減算では、減算される側の文字クラスの中で完全な文字クラス構文を使用できるため、さらにその内部で別のクラスを減算する、いわゆる「ネスト」が可能です。 例えば、[0-9-[0-7-[0-3]]] という正規表現を見てみましょう。まず 0-7 から 0-3 を減算すると [0-9-[4-7]] となり、これは [0-38-9] と同等の意味になります。結果として、このパターンは「012389」のいずれかの1文字にマッチします。 減算は必ず文字クラスの最後の要素に記述する 文字クラスの減算は、常に文字クラスの最後の要素として記述しなければなりません。例えば
-
Pythonで名前空間を作成する方法をわかりやすく解説
Pythonでは、パッケージ、モジュール、クラス、関数、メソッドのそれぞれが独自の「名前空間(namespace)」を持っており、変数名はこの名前空間の中で解決されます。そして、関数やモジュール、パッケージが評価される(つまり実行が開始される)タイミングで、新しい名前空間が自動的に生成されます。そのため、名前空間を作成したい場合は、以下のいずれかの操作を行うだけで実現できます。関数を呼び出すオブジェクトをインスタンス化するモジュールをインポートするパッケージをインポートする例えば、「Namespace」というクラスを定義し、そのクラスのインスタンスを生成すれば、そのオブジェクト自体が一つの名前