ドキュメントによると、object
はすべて新しいスタイルのクラスの基本クラスです。
そして、AFAIK、いわゆる新しいスタイルのクラスは、継承することによっていくつかの新しい機能を取得できるクラスobject
ですよね?
object
継承type
または使用することを考えtype
まし__metaclass__
たが、object.__bases__
何も得られないので、これはobject
どこから来たのか、そしてそれとの関係は何type
ですか?
object
実際、クラスのタイプ(つまり、メタクラス)は次のtype
とおりです。
type(object) == type # True
そして、object
は基本クラスであるため、ご想像のとおり、独自の親はありません。
object.__bases__ == () # True
object
属性を必要としないため、__metaclass__
属性はありません。デフォルトのメタクラスを使用しますtype
。
type
は実際にはのサブクラスであるため、少し混乱しますが(構築する必要があるときにobject
どのtype
ように派生させることができますか?)、これはPythonインタープリターのCレベルで少しハードコーディングすることで解決されます。object
type
object
これはすべて、新しいスタイルのクラス、つまり。から派生したクラスにのみ適用されobject
ます。Python 3では、すべてのクラスが新しいスタイルであるため、これはPython3でグローバルに適用されます。
覚えておくと役立つ2つの概念があります。
__bases__
。それはobject
確かにtype
メタクラスとして持っていることを意味します。
好奇心と同じように、物語の「逆説的」な部分はtype
、メタクラスであることもオブジェクトですが、それ自体をメタクラスとして持つことはできません(あなたが考えるなら、それは少し鶏と卵の問題になるでしょう)それについて)。
パラドックスは、PythonソースコードのCブードゥーで解決されますが、私はそれについてあまり知りません!
編集:(いくつかのサンプルコード)
>>> class MyMeta(type):
... def __new__(cls, name, bases, dct):
... return type.__new__(cls, name, bases, dct)
...
>>> class MyClass(object):
... __metaclass__ = MyMeta
...
obj
今、から継承することを観察しますobject
>>> obj = MyClass()
>>> MyClass.__bases__
(<type 'object'>,)
コメントの質問については、属性dir(obj)
が出力されません。理由は、インスタンス化されたオブジェクトではなく、クラスの属性であるためです。実際、次のことに注意してください。__metaclass__
__metaclass__
>>> dir(MyClass)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__metaclass__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
>>> MyClass.__metaclass__
<class '__main__.MyMeta'>
メタクラスの理解を深めることに興味がある場合、これは古典的なSOの質問です(もちろん、非常に包括的な答えがあります!):
HTH!