Can __iter__ be used as a classmethod?

Michele Simionato mis6 at pitt.edu
Tue Mar 11 15:03:46 EST 2003


Thomas Heller <theller at python.net> wrote in message news:<bs0i3rvc.fsf at python.net>..
> 
> Maybe 'classmethod' is as weird as what some people aks for in this
> forum (and they are overly happy if I point out that it is indeed
> possible, while the 'right' answer would probably be 'you don't want to
> desing your program in this way'): Have a method that binds to the class
> if called from the class, and binds to the instance if called from an
> instance.
> 
> > 
> > > And _having_ to write a custom metaclass as the
> > > only way to get classmethods would be somewhat of an overkill.
> 
> While Guido doesn't like this notation, I actually find it nice:
> 
> class MyClass(object):
> 
>     class __metaclass__(type):
> 
>         def my_class_methods(cls):
>             .....
> 
>     def my_normal_method(self):
>         ....
> 
> (Donald Beaudry had a similar notation in his objectmodule.c, which
> also provided class methods).
> 
> Thomas

I have used that trick few days ago to define Frozen classes:

def frozen(self,name,value):
    if hasattr(self,name):
        object.__setattr__(self,name,value) # standard __setattr__
    else:
        raise AttributeError("You cannot add attributes to %s" % self)

class Frozen(object):
    """Subclasses of Frozen are frozen, i.e. it is impossible to add
     new attributes to them and their instances, except via inheritance"""
    __setattr__ = frozen
    class __metaclass__(type):
        __setattr__ = frozen

This kills Python dynamism. Also, it become impossible to use the
self.var=something idiom, and one is forced to write code as in a 
static compiled language. It protects your code against run-time
modifications (unless one overrides __setattr__).


                          Michele




More information about the Python-list mailing list