3

メタクラスに関するこの興味深い投稿を読んでいました Python のメタクラスとは? . 受け入れられた回答は、次の署名を持つ型を使用してクラスを作成する方法を示しています。

type (クラスの名前、親クラスのタプル (継承のため、空にすることができます)、属性の名前と値を含む辞書)

上記の署名を使用して 'type' クラスを作成しようとしましたが、そもそも作成できることに驚きました。あなたの意見は大歓迎です!

type = type('type',(),{});

第二に、上記の構文を使用して型クラスを作成した後、実行できませんでした

myclass = type('myclass',(),{}); 

type = type('type',(),{});

と言うエラーが出ました

トレースバック (最新の呼び出しが最後): ファイル ""、1 行目、TypeError: オブジェクト。new () はパラメータを取りません

しかし、次のことを試みたところ、成功することができました。

class myclass(object):
    pass

私の理解によれば、上記のスニペットはクラス「myclass」を作成するためにタイプを呼び出す必要があるため、私は困惑しています。どうしたの!?詳細がありませんか?

4

2 に答える 2

6

タイプとタイプをシャドウイングしましたtype = type('type',(),{})

Pythonではセミコロンが冗長であることに注意してください。

つまり、何もできないタイプを作成しているのです。

だから、後でtype壊れます。

于 2012-06-25T20:59:29.763 に答える
0

意味

>>> shadow = type("type",(),{})
>>> shadow
<class '__main__.type'>
>>> isinstance(shadow,type)
True
>>> issubclass(shadow,type)
False
>>> shadow(int)

Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    shadow(int)
TypeError: object.__new__() takes no parameters

工事

>>> class shadow(type):
    pass

>>> shadow
<class '__main__.shadow'>
>>> isinstance(shadow,type)
True
>>> issubclass(shadow,type)
True
>>> shadow(int)
<type 'type'>
>>> shadow(type)
<type 'type'>
>>> shadow(1)
<type 'int'>

Python (および Python C API): __new__ と __init__ の比較

于 2012-06-25T21:20:39.280 に答える