2012-11-16 12 views

答えて

14

Python2では、objectを基底クラスとして宣言すると、クラスはnew-style classになります。それ以外の場合は、 "古典的な"クラスです。違いの中で

  • プロパティが唯一の新しいスタイルのクラスでは動作し

  • 新しいスタイルのクラスはmro method

  • 新しいスタイルのクラスは、古典的なクラスが

    が不足している多くの属性を持っていることです
    In [288]: class Foo: pass 
    In [289]: dir(Foo) 
    Out[289]: ['__doc__', '__module__'] 
    
    In [290]: class Bar(object): pass 
    In [291]: dir(Bar) 
    Out[291]: ['__class__', '__delattr__',  '__dict__', '__doc__', '__format__', '__getattribute__',  '__hash__', '__init__', '__module__', '__new__', '__reduce__',  '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',  '__str__', '__subclasshook__', '__weakref__'] 
    

クラスicクラスは後方互換性のためにのみPython2で保持されます。定義したすべてのカスタムクラスは、新しいスタイルにする必要があります。

Python3では、すべてのクラスが新しいスタイルなので、明示的にそのクラスを宣言する必要はありません。

+0

+1これ! AFAIKには、新しいスタイルのクラスを使用することには欠点はありませんので、例外なくすべてのクラスを使用する必要があります。古いスタイルのクラスは、その名前が示すように、下位互換性のためにのみ存在します(これがPython 3.0で最終的に削除された理由です)。 –

+0

複数の古いものを提供していただき、ありがとうございます。私は人々が他の人が学ぶのを助けるために時間をとると感謝します。 – Paxwell

+0

私はoldstyleクラスの1つの時折の利点を考えることができます:特別なメソッドの参照がインスタンス上にある可能性があります。例えば。 'a = oldstyle(); a .__ add__ = lambda * args: 'changed''は動作しますが、newstyleオブジェクトと同等の機能は動作しません。たぶん1回か2回私はこれが新しいクラスを作成せずに動作することを望みましたが、それだけです、そして、それは私の構造が再考する必要があったという印でした。 – DSM

0

Python 2では、objectはそれを「新しいスタイルのクラス」にします。これが意味することの詳細はそれほど重要ではありませんが、結論は常に使用しなければならないか、正しく動作しないことがあります。

Python 3では、すべてが常に新しいスタイルのクラスなので、objectを使用する必要はありません。

関連する問題