2. クラスとオブジェクト
>>> class A(object):
... pass
...
>>> A
<class '__main__.A'>
>>> a = A()
>>> AA = A
>>> aa = AA()
>>> a
<__main__.A object at 0x922b0>
>>> aa
<__main__.A object at 0x92210>
5. typeコンストラクタで動的にクラス定義
>>> X = type('X', (A,), {})
>>> X
<class '__main__.X'>
>>> x = X()
>>> isinstance(x, A)
True
>>> isinstance(x, X)
True
6. クラスとメタクラス
>>> class AType(type):
... def __init__(cls, name, parents, dct):
... super(AType, cls).__init__(name, parents, dct)
... print '%s defined' % name
...
>>> class AAA(object):
... __metaclass__ = AType
...
AAA defined
7. メタクラス応用
def trace(func):
def wrap(*args, **kwargs):
print args, kwargs
return func(*args, **kwargs)
return wrap
class Traceable(type):
def __init__(cls, name, parents, dct):
super(Traceable, cls).__init__(name, parents, dct)
for k, v in [(k, trace(v)) for k, v in dct.iteritems() if callable
(v) and not k.startswith('_')]:
setattr(cls, k, v)
8. 使ってみる
class Hello(object):
__metaclass__ = Traceable
def greedy(self, name):
print "Hello, %s" % name
h = Hello()
h.greedy('aodag')