Python:metaclass: meta-meta class

hdknr@deb09:~/bitbucket/tohyo/trunk/tohyo$ python
Python 2.5.2 (r252:60911, Jan  4 2009, 17:40:26)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class Sentai(type): # meta-meta class
...     def __new__(cls,name,bases,dict):
...         def classgen(cls_,name_,bases_,dict_):
...             def say(self): print 'Save the world!'
...             dict_['say'] = say
...             return type.__new__(cls_,name_,bases_,dict_)
...         dict['__new__'] = classgen
...         return type.__new__(cls,name,bases,dict)
...
>>> dir()
['Sentai', '__builtins__', '__doc__', '__name__']
>>> type(Sentai)
<type 'type'>

>>> dir(Sentai)
['__base__', '__bases__', '__basicsize__', '__call__', '__class__', '__cmp__',
 '__delattr__', '__dict__', '__dictoffset__', '__doc__', '__flags__', '__getattribute__',
 '__hash__', '__init__', '__itemsize__', '__module__', '__mro__', '__name__', '__new__',
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__subclasses__',
 '__weakrefoffset__', 'mro']
>>> dir(type)
['__base__', '__bases__', '__basicsize__', '__call__', '__class__', '__cmp__',
 '__delattr__', '__dict__', '__dictoffset__', '__doc__', '__flags__', '__getattribute__',
 '__hash__', '__init__', '__itemsize__', '__module__', '__mro__', '__name__', '__new__',
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__subclasses__',
 '__weakrefoffset__', 'mro']

>>> class SuperSentai(type): #meta-class
...     __metaclass__ = Sentai
...
>>> dir()
['Sentai', 'SuperSentai', '__builtins__', '__doc__', '__name__']

>>> type(SuperSentai)
<class '__main__.Sentai'>

>>> dir(SuperSentai)
['__base__', '__bases__', '__basicsize__', '__call__', '__class__', '__cmp__',
 '__delattr__', '__dict__', '__dictoffset__', '__doc__', '__flags__', '__getattribute__',
 '__hash__', '__init__', '__itemsize__', '__metaclass__', '__module__', '__mro__', '__name__', '__new__',
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__subclasses__',
 '__weakrefoffset__', 'mro']

>>> type(SuperSentai.__metaclass__)
<type 'type'>

>>> type(SuperSentai.mro)
<type 'method_descriptor'>
>>> type(Sentai.mro)
<type 'method_descriptor'>
>>> Sentai.mro
<method 'mro' of 'type' objects>
>>> SuperSentai.mro
<method 'mro' of 'type' objects>
>>> (Sentai.mro == SuperSentai.mro)
True

>>> class GaoRanger(type):
...     __metaclass__ = SuperSentai
...

>>> dir()
['GaoRanger', 'Sentai', 'SuperSentai', '__builtins__', '__doc__', '__name__']
>>> type(GaoRanger)
<class '__main__.SuperSentai'>

>>> dir(GaoRanger)
['__base__', '__bases__', '__basicsize__', '__call__', '__class__', '__cmp__',
 '__delattr__', '__dict__', '__dictoffset__', '__doc__', '__flags__', '__getattribute__',
 '__hash__', '__init__', '__itemsize__', '__metaclass__', '__module__', '__mro__', '__name__', '__new__',
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__subclasses__',
 '__weakrefoffset__', 'mro', 'say']

>>> type(GaoRanger.mro),type(SuperSentai.mro),type(Sentai.mro)
(<type 'method_descriptor'>, <type 'method_descriptor'>, <type 'method_descriptor'>)

>>> (GaoRanger.mro == Sentai.mro)
True

>>> type(GaoRanger.say)
<type 'instancemethod'>
>>> type(SuperSentai.say)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'SuperSentai' has no attribute 'say'

>>> class GaoRed(object):
...    __metaclass__ = GaoRanger
...
>>> r=GaoRed()
>>> r
<__main__.GaoRed object at 0xb7d4622c>
>>> type(r)
<class '__main__.GaoRed'>
>>> type(GaoRed)
<class '__main__.GaoRanger'>
>>> class GaoRed(object):
...     __metaclass__ = SuperSentai
...

>>> type(GaoRed)
<class '__main__.SuperSentai'>
>>> r=GaoRed()
>>> r
<__main__.GaoRed object at 0xb7d4624c>
>>> dir(r)
['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__',
 '__metaclass__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
 '__str__', '__weakref__', 'say']
>>> r.say()
Save the world!

カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中