Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonの旧スタイルクラスと新スタイルクラスの違いとは?

Python 2.xにおける2つのクラススタイル

Python 2.xでは、基底クラスとして組み込み型を持つかどうかによって、クラスは「旧スタイル」と「新スタイル」の2種類に分類されます。この違いは一見些細なものに見えますが、実際にはクラスで使える機能に大きな差をもたらします。

旧スタイル(クラシック)クラス

組み込み型を基底クラスに持たないクラスが、いわゆる「クラシック」スタイル、すなわち旧スタイルクラスです。

>>> class OldSpam:      # 基底クラスなし
...     pass
>>> OldSpam.__bases__
()

新スタイルクラス

一方、組み込み型を基底クラスに持つクラスが新スタイルクラスです。これは、直接的または間接的にobjectを基底クラスとして継承していることを意味します。

>>> class NewSpam(object):          # objectから直接継承
...     pass
>>> NewSpam.__bases__
(<type 'object'>,)

>>> class IntSpam(int):             # int経由で間接的にobjectを継承
...     pass
>>> IntSpam.__bases__
(<type 'int'>,)

>>> IntSpam.__bases__[0].__bases__ # int自体がobjectを継承しているため
(<type 'object'>,)

新スタイルクラスを使うべき理由

クラスを定義する際は、常に新スタイルクラスを選ぶことをおすすめします。その利点は数多くありますが、代表的なものを以下に挙げます。

ディスクリプタのサポート

最大のメリットはディスクリプタが使えることです。これにより、次のような強力な構文が利用可能になります。

  • classmethod — インスタンスではなく、クラス自身を暗黙の第一引数として受け取るメソッド。
  • staticmethodselfを暗黙の引数として受け取らない、独立したメソッド。
  • property — 属性の取得・設定・削除を管理する専用の関数を定義できるプロパティ機能。

さらに、super()による協調的な多重継承、__slots__によるメモリ使用量の最適化、__getattribute__などの属性アクセスフックも、新スタイルクラスならではの機能です。

Python 3.xではどう変わったのか

Python 3.xでは、新スタイルクラスだけが暗黙的にサポートされるようになりました。クラス宣言時に括弧内へobjectと明記する必要はなく、すべてのクラスが自動的にobjectを継承します。そのため、旧スタイルクラスという概念自体が廃止され、開発者が意識する必要はなくなりました。

  1. TkinterのTkクラスとToplevelクラスの違いとは?使い分けをわかりやすく解説

    Tkinterアプリケーションでは、まずTkオブジェクトを初期化することでウィンドウが作成されます。TkはあらゆるTkinterアプリケーションに不可欠な最小構成要素であり、アプリケーションをインスタンス化する役割を担います。すべてのウィジェットが配置されるメインウィンドウなど、アプリケーションの基本的な土台を構築するのがTkです。 一方、Toplevelクラスは、メインアプリケーションの内部ウィジェットと連携しながら動作します。代表例がToplevelウィンドウで、アプリケーションのメインウィンドウとは別に子ウィンドウを表示するために使用されます。ToplevelウィンドウはTkと同様に機能

  2. Pythonのtkinterとtkinter.ttkウィジェットの違いとは?スタイリング方法を解説

    tkinter.ttkは、tkinterウィジェットのスタイル(見た目)を設定するためのモジュールです。HTML要素にCSSでデザインを適用するように、tkinter.ttkを使うことでtkinterウィジェットの外観を自由にカスタマイズできます。 tkinterウィジェットとtkinter.ttkの主な違い tkinterウィジェットは、ボタン・ラベル・テキスト・スクロールバーなど、基本的なGUI部品を追加するために使用します。一方、tkinter.ttkは標準のtkinterよりも多くの種類のウィジェットをサポートしています。 tkinter.ttkではPlaceやPack()、Grid