5

ドキュメントによると、objectはすべて新しいスタイルのクラスの基本クラスです。

そして、AFAIK、いわゆる新しいスタイルのクラスは、継承することによっていくつかの新しい機能を取得できるクラスobjectですよね?

object継承typeまたは使用することを考えtypeまし__metaclass__たが、object.__bases__何も得られないので、これはobjectどこから来たのか、そしてそれとの関係は何typeですか?

4

3 に答える 3

5

object実際、クラスのタイプ(つまり、メタクラス)は次のtypeとおりです。

type(object) == type      # True

そして、objectは基本クラスであるため、ご想像のとおり、独自の親はありません。

object.__bases__ == ()    # True

object属性を必要としないため、__metaclass__属性はありません。デフォルトのメタクラスを使用しますtype

typeは実際にはのサブクラスであるため、少し混乱しますが(構築する必要があるときにobjectどのtypeように派生させることができますか?)、これはPythonインタープリターのCレベルで少しハードコーディングすることで解決されます。objecttype object

これはすべて、新しいスタイルのクラス、つまり。から派生したクラスにのみ適用されobjectます。Python 3では、すべてのクラスが新しいスタイルであるため、これはPython3でグローバルに適用されます。

于 2012-05-08T06:40:53.420 に答える
3

覚えておくと役立つ2つの概念があります。

  • クラスやメタクラスを含む、Pythonのすべてがオブジェクトです
  • メタクラスはクラスのコンストラクターであり、その祖先ではないため、に表示されません__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の質問です(もちろん、非常に包括的な答えがあります!):

Pythonのメタクラスとは何ですか?

HTH!

于 2012-05-08T06:38:20.023 に答える
2

あなたはこれこの投稿が面白いと思うかもしれません。これが最初の図です:

ここに画像の説明を入力してください

于 2012-05-08T07:58:38.700 に答える