私は、Pythonでメタクラスについて直感を覚えようとしていました。私はPython2.7とPython3.5の両方で試しました。 Python 3.5では、私たちが明示的に継承するかどうかにかかわらず、定義したすべてのクラスがタイプ<class 'type'>
であることがわかりました。しかし、タイプから継承されない場合は、そのクラスを別のクラスのメタクラスとして使用することはできません。python3.xでメタクラスを実装するための '型'を明示的に継承しました
>>> class foo:
pass
>>> class Metafoo(type):
pass
>>> foo
<class '__main__.foo'>
>>> Metafoo
<class '__main__.Metafoo'>
>>> type(foo)
<class 'type'>
>>> type(Metafoo)
<class 'type'>
>>>
>>> class foocls1(metaclass=foo):
pass
私は次のエラーを取得の上にやって:
Traceback (most recent call last):
File "<pyshell#52>", line 1, in <module>
class foocls1(metaclass=foo):
TypeError: object() takes no parameters
をしかし、新しいクラスのメタクラスとして
>>> class foocls3(metaclass=Metafoo):
pass
>>> foocls3
<class '__main__.foocls3'>
>>> type(foocls3)
<class '__main__.Metafoo'>
をMetafooを使用しながら、それがケースではありませんが、誰もが理由を説明することができますこれは、クラスを他のクラスのメタクラスとして使用したい場合、明示的に継承する必要がある場合です。
すべてのクラスは 'type'の*インスタンス*ですが、' type'のすべての*サブクラスではありません。 – user2357112