ドキュメントによると、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レベルで少しハードコーディングすることで解決されます。objecttype 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!