class _ClassMethod: # Helper class: instances represent methods bound to a class def __init__(self, klass, func): self.func = func # oops: circular reference! self.klass = klass def __call__(self, *args, **kw): # return result of function call return self.func(self.klass, *args, **kw) import ExtensionClass class Class(ExtensionClass.Base): def __class_init__(self): # automagically convert methods to class methods # # ExtensionClass.Base calls this _class_ method after the _class_ # has been created! for mth in self.__class_methods__: self.__dict__[mth.func_name] = _ClassMethod(self, mth) def class_method(self, *args, **kw): # A _class method_ creating an returning new a new instance # the 'self' argument is actual class itself print "class_method called with", self, args, kw return self() def class_method_2(self, *args, **kw): # Class methods may return anything they like print "class_method_2 called with", self, args, kw return None def instance_method(self, *args, **kw): # instance methods behave normally print "instance_method called with", self, args, kw # List the methods which should be automagically be converted # into class methods __class_methods__ = class_method, class_method_2 class Subclass(Class): def class_method_2(self): # override a class method in a subclass print "Hi from", self #################################################################### c = Class() # demonstrate calling class methods print Class.class_method() print Class.class_method(1, 2, 3, a=10, b=20, c=30) print Subclass.class_method() print Class.class_method_2() print Subclass.class_method_2() # demonstrate calling instance methods c.instance_method() try: Class.instance_method() except Exception, detail: print "Called instance method off the class:\n\t", detail # calling class methods off an instance also works... print c.class_method()