diff options
author | Benjamin Peterson <benjamin@python.org> | 2009-05-07 19:14:14 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2009-05-07 19:14:14 (GMT) |
commit | 34c044ff5b7af76c4b65c63e1923183a9957de2e (patch) | |
tree | 32152a05a05d145432cffb7147bceeb6551bdcc7 /Demo/metaclasses/Meta.py | |
parent | 993527485ebb3f8a7e8759ab480547a0b61b82eb (diff) | |
download | cpython-34c044ff5b7af76c4b65c63e1923183a9957de2e.zip cpython-34c044ff5b7af76c4b65c63e1923183a9957de2e.tar.gz cpython-34c044ff5b7af76c4b65c63e1923183a9957de2e.tar.bz2 |
remove old metaclass demos
Diffstat (limited to 'Demo/metaclasses/Meta.py')
-rw-r--r-- | Demo/metaclasses/Meta.py | 118 |
1 files changed, 0 insertions, 118 deletions
diff --git a/Demo/metaclasses/Meta.py b/Demo/metaclasses/Meta.py deleted file mode 100644 index 90bfd97..0000000 --- a/Demo/metaclasses/Meta.py +++ /dev/null @@ -1,118 +0,0 @@ -"""Generic metaclass. - -XXX This is very much a work in progress. - -""" - -import types - -class MetaMethodWrapper: - - def __init__(self, func, inst): - self.func = func - self.inst = inst - self.__name__ = self.func.__name__ - - def __call__(self, *args, **kw): - return self.func(self.inst, *args, **kw) - -class MetaHelper: - - __methodwrapper__ = MetaMethodWrapper # For derived helpers to override - - def __helperinit__(self, formalclass): - self.__formalclass__ = formalclass - - def __getattr__(self, name): - # Invoked for any attr not in the instance's __dict__ - try: - raw = self.__formalclass__.__getattr__(name) - except AttributeError: - try: - ga = self.__formalclass__.__getattr__('__usergetattr__') - except (KeyError, AttributeError): - raise AttributeError(name) - return ga(self, name) - if type(raw) != types.FunctionType: - return raw - return self.__methodwrapper__(raw, self) - -class MetaClass: - - """A generic metaclass. - - This can be subclassed to implement various kinds of meta-behavior. - - """ - - __helper__ = MetaHelper # For derived metaclasses to override - - __inited = 0 - - def __init__(self, name, bases, dict): - try: - ga = dict['__getattr__'] - except KeyError: - pass - else: - dict['__usergetattr__'] = ga - del dict['__getattr__'] - self.__name__ = name - self.__bases__ = bases - self.__realdict__ = dict - self.__inited = 1 - - def __getattr__(self, name): - try: - return self.__realdict__[name] - except KeyError: - for base in self.__bases__: - try: - return base.__getattr__(name) - except AttributeError: - pass - raise AttributeError(name) - - def __setattr__(self, name, value): - if not self.__inited: - self.__dict__[name] = value - else: - self.__realdict__[name] = value - - def __call__(self, *args, **kw): - inst = self.__helper__() - inst.__helperinit__(self) - try: - init = inst.__getattr__('__init__') - except AttributeError: - init = lambda: None - init(*args, **kw) - return inst - - -Meta = MetaClass('Meta', (), {}) - - -def _test(): - class C(Meta): - def __init__(self, *args): - print("__init__, args =", args) - def m1(self, x): - print("m1(x=%r)" % (x,)) - print(C) - x = C() - print(x) - x.m1(12) - class D(C): - def __getattr__(self, name): - if name[:2] == '__': raise AttributeError(name) - return "getattr:%s" % name - x = D() - print(x.foo) - print(x._foo) -## print x.__foo -## print x.__foo__ - - -if __name__ == '__main__': - _test() |