classmethod() not inherited?
Jack Diederich
jack at performancedrivers.com
Thu Jan 16 14:49:20 EST 2003
On Thu, Jan 16, 2003 at 11:25:37AM +0100, Martin v. Löwis wrote:
> Jack Diederich <jack at performancedrivers.com> writes:
>
> > How is it possible to have classmethods still be
> > classmethods in their kids?
>
> As you found out, you have to explicitly generate class methods,
> again.
>
> > I'd like to have ALL of the derivitives of Base
> > have foo as a classmethod, but it doesn't seem
> > to be automatic and the following doesn't work
> >
> > import Test
> >
> > for (Test.A .. Test.Z): # pseudo code
> > Test.A.foo = classmethod(Test.A.foo)
>
> This doesn't work because the classmethod builtin does not really
> accept method objects. It would work if you write either
>
> Test.A.foo = classmethod(Test.A.foo.im_func)
>
> or
>
> Test.A.foo = classmethod(Test.A.__dict__['foo'])
>
> I readily admit that both constructs are hacks that make unacceptable
> use of implementation details :-)
I tried this for fun, and Object/classobjec.c#PyMethod_New
likes to throw BadInternalCall exceptions. (668980 bug on sourceforge is
very similar)
>
> However, you may reconsider your need to redefine the class method in
> every subclass. The whole point of class methods is that they get the
> class as argument, which, in many cases, can help to avoid
> redefinitions, e.g. in
>
> class Person:
> minage = 0
> maxage = 100
> def span(self):
> return self.maxage-self.minage
> span=classmethod(span)
>
> class Child:
> maxage = 18
>
> class Adult:
> minage = 18
>
> Now, the .span method works fine for all three classes.
>
Perfect, I'd forgotten that extra spiffyness of classmethod versus
staticmethod.
-jack
More information about the Python-list
mailing list