2016-09-15 5 views
5

これは古いスタイルのクラスである:オブジェクトをメタクラスと定義するのと同じようにサブクラス化していますか?

class OldStyle: 
    pass 

これは、新しいスタイルのクラスである:

class NewStyle(object): 
    pass 

これはまた、新しいスタイルのクラスです:

class NewStyle2: 
    __metaclass__ = type 

がありますNewStyleNewStyle2の間の違いはありますか?

objectから継承する唯一の効果は実際にはtypeメタクラスを定義するという印象がありますが、それ以外の違いは何も確認できません。

答えて

2

かなり可、NewStyleNewStyle2の間に違いはありません。両方ともタイプtypeであり、OldStyleタイプはclassobjです。

オブジェクトからサブクラス化する場合は、__class__ of object (meaning type) is goingを使用します。 __metaclass__ that is going to get picked upを指定した場合。

__metaclass__として何も指定されておらず、objectから継承しない場合、Py_ClassType is assigned as the metaclassが代わっています。

すべての場合、metaclass.__new__が呼び出されます。 Py_ClassType.__new__の場合、定義されたセマンティクス(実際にはそれらを調べたことはありません)とクラスのベースにあるtype.__new__ it makes sure to pack objectに従います。

もちろん、同様の効果をすることによって達成される:

コールは直ちに typeになる
cls = type("NewStyle3",(), {}) 

。それはちょうどより大きな面倒です:-)

関連する問題