Can __iter__ be used as a classmethod?

Michele Simionato mis6+ at pitt.edu
Tue Mar 4 22:41:15 CET 2003


From: Bjorn Pettersen

> From: Michele Simionato [mailto:mis6 at pitt.edu] 
> [...]
> Is there any good reason for supporting classmethods in Python ?

> Yes, classmethods can do everything staticmethods can, plus
>polymorphism. E.g.:

>>> class meta(type):
...   def call_f(cls): cls.f()
...
>>> class A(object):
...   __metaclass__ = meta
...   def f(cls): print 'A.f'
...   f = classmethod(f)
...
>>> class B(object):
...   __metaclass__ = meta
...   def f(cls): print 'B.f'
...   f = classmethod(f)
...
>>> A.call_f()
A.f
>>> B.call_f()
B.f
>>>

This code does not make a good example for classmethods, since
it can be rewritten by using staticmethods (the knowledge of cls
is not used in f). 

Anyway, I can emulate classmethods with regular methods in the
metaclass:

>>> class meta(type):
...   def call_f(cls): cls.f() # a perverse way of calling f
...   def f(cls): print "%s.f" % cls.__name__

>>> class A(object):
...   __metaclass__ = meta
...
>>> class B(A): pass #notice: B inherits the metaclass of A
...

>>> A.call_f()
A.f
>>> B.call_f()
B.f

> Digressing: It never occurred to me that assignment to __metaclass__ was
> defining the class of your class until it was pointed out earlier today.
> That made everything much clearer :-)
>
> -- bjorn

You may find interesting this article:

http://www-106.ibm.com/developerworks/linux/library/l-pymeta.html

-- 
Michele Simionato - Dept. of Physics and Astronomy
210 Allen Hall Pittsburgh PA 15260 U.S.A.
Phone: 001-412-624-9041 Fax: 001-412-624-9163
Home-page: http://www.phyast.pitt.edu/~micheles/





More information about the Python-list mailing list