diff options
author | Guido van Rossum <guido@python.org> | 1997-08-26 00:08:51 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1997-08-26 00:08:51 (GMT) |
commit | 0cdb88767647cc4a684cdb61b9fd9aa9a89d75cb (patch) | |
tree | d159aaa8a69f2e94ca083277d6782a43b6c61fa7 /Demo/metaclasses/Simple.py | |
parent | 910105515ebe340fafe357f8fe1b898787a292a0 (diff) | |
download | cpython-0cdb88767647cc4a684cdb61b9fd9aa9a89d75cb.zip cpython-0cdb88767647cc4a684cdb61b9fd9aa9a89d75cb.tar.gz cpython-0cdb88767647cc4a684cdb61b9fd9aa9a89d75cb.tar.bz2 |
Completed first draft.
Diffstat (limited to 'Demo/metaclasses/Simple.py')
-rw-r--r-- | Demo/metaclasses/Simple.py | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/Demo/metaclasses/Simple.py b/Demo/metaclasses/Simple.py new file mode 100644 index 0000000..03ed259 --- /dev/null +++ b/Demo/metaclasses/Simple.py @@ -0,0 +1,45 @@ +import types + +class Tracing: + def __init__(self, name, bases, namespace): + """Create a new class.""" + self.__name__ = name + self.__bases__ = bases + self.__namespace__ = namespace + def __call__(self): + """Create a new instance.""" + return Instance(self) + +class Instance: + def __init__(self, klass): + self.__klass__ = klass + def __getattr__(self, name): + try: + value = self.__klass__.__namespace__[name] + except KeyError: + raise AttributeError, name + if type(value) is not types.FunctionType: + return value + return BoundMethod(value, self) + +class BoundMethod: + def __init__(self, function, instance): + self.function = function + self.instance = instance + def __call__(self, *args): + print "calling", self.function, "for", self.instance, "with", args + return apply(self.function, (self.instance,) + args) + +Trace = Tracing('Trace', (), {}) + +class MyTracedClass(Trace): + def method1(self, a): + self.a = a + def method2(self): + return self.a + +aninstance = MyTracedClass() + +aninstance.method1(10) + +print aninstance.method2() |