メタクラスプロトコル

8

Click here to load reader

Upload: atsushi-odagiri

Post on 03-Jul-2015

484 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: メタクラスプロトコル

メタクラスプロトコル

aodag

Page 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>

Page 3: メタクラスプロトコル

>>> a.__class__<class '__main__.A'>>>> a.__class__ is ATrue>>> aa.__class__ is ATrue

Page 4: メタクラスプロトコル

クラスとタイプ

>>> aa.__class__ is ATrue>>> A.__class__<type 'type'>

Page 5: メタクラスプロトコル

typeコンストラクタで動的にクラス定義

>>> X = type('X', (A,), {})>>> X<class '__main__.X'>>>> x = X()>>> isinstance(x, A)True>>> isinstance(x, X)True

Page 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

Page 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)

Page 8: メタクラスプロトコル

使ってみる

class Hello(object): __metaclass__ = Traceable def greedy(self, name): print "Hello, %s" % name

h = Hello()h.greedy('aodag')