メタクラスプロトコル
TRANSCRIPT
メタクラスプロトコル
aodag
クラスとオブジェクト
>>> 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>
>>> a.__class__<class '__main__.A'>>>> a.__class__ is ATrue>>> aa.__class__ is ATrue
クラスとタイプ
>>> aa.__class__ is ATrue>>> A.__class__<type 'type'>
typeコンストラクタで動的にクラス定義
>>> X = type('X', (A,), {})>>> X<class '__main__.X'>>>> x = X()>>> isinstance(x, A)True>>> isinstance(x, X)True
クラスとメタクラス
>>> 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
メタクラス応用
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)
使ってみる
class Hello(object): __metaclass__ = Traceable def greedy(self, name): print "Hello, %s" % name
h = Hello()h.greedy('aodag')