Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

How can I define class methods outside of the class?

5 views
Skip to first unread message

Jeremy

unread,
Dec 2, 2010, 12:36:32 AM12/2/10
to
I have some methods that I need (would like) to define outside of the
class. I know this can be done by defining the function and then
setting it equal to some member of an instance of the class. But,
because of the complexity of what I'm doing (I have to set many
functions as class methods) I would rather not do this. Can someone
show me how to do this? Is it even possible? Can decorators be used
here?

Thanks,
Jeremy

James Mills

unread,
Dec 2, 2010, 12:47:35 AM12/2/10
to python list

Do you mean something like this ?

@classmethod
def foo(cls):
print "I am the foo classmethod on %r" % cls

class Foo(object):
pass

Foo.foo = foo

cheers
James

--
-- James Mills
--
-- "Problems are solved by method"

Ian Kelly

unread,
Dec 2, 2010, 2:32:07 AM12/2/10
to pytho...@python.org
On 12/1/2010 10:47 PM, James Mills wrote:
> On Thu, Dec 2, 2010 at 3:36 PM, Jeremy<jlco...@gmail.com> wrote:
> Do you mean something like this ?
>
> @classmethod
> def foo(cls):
> print "I am the foo classmethod on %r" % cls
>
> class Foo(object):
> pass
>
> Foo.foo = foo

Slightly better:

def foo(cls):
# Do something

class Foo(object):
pass

Foo.foo = classmethod(foo)

This way the unbound foo is callable as well.

Cheers,
Ian

Jeremy

unread,
Dec 2, 2010, 9:45:46 AM12/2/10
to
On Dec 1, 10:47 pm, James Mills <prolo...@shortcircuit.net.au> wrote:

> On Thu, Dec 2, 2010 at 3:36 PM, Jeremy <jlcon...@gmail.com> wrote:
> > I have some methods that I need (would like) to define outside of the
> > class.  I know this can be done by defining the function and then
> > setting it equal to some member of an instance of the class.  But,
> > because of the complexity of what I'm doing (I have to set many
> > functions as class methods) I would rather not do this.  Can someone
> > show me how to do this?  Is it even possible?  Can decorators be used
> > here?
>
> Do you mean something like this ?
>
> @classmethod
> def foo(cls):
>     print "I am the foo classmethod on %r" % cls
>
> class Foo(object):
>     pass
>
> Foo.foo = foo
>
> cheers
> James

Thanks, James. That is almost exactly what I want. However, I want
to avoid doing

Foo.foo = foo

Is this going to be possible? I'm trying to understand how decorators
are used. Are they really necessary in this example?

Thanks,
Jeremy

bruno.des...@gmail.com

unread,
Dec 2, 2010, 12:19:53 PM12/2/10
to
On 2 déc, 06:36, Jeremy <jlcon...@gmail.com> wrote:
> I have some methods that I need (would like) to define outside of the
> class.  I know this can be done by defining the function and then
> setting it equal to some member

<OT>
"assignement" or "binding" might be the terms you were looking for
here ;)

Also in Python we talk about "attributes", not "members"
</OT>

> of an instance of the class.

What you describe here will not "define class methods", nor even
instance methods FWIW - it will only make the function an attribute of
the instance, but won't turn the function into a method (IOW: the
function won't get the instance as first argument).

Also and while we're at it, a Python "classmethod" is something
special - it's a method that can be called on either an instance or
the class itself, and takes the class - not the instance - as first
argument.

> But,
> because of the complexity of what I'm doing (I have to set many
> functions as class methods) I would rather not do this.  Can someone
> show me how to do this?  Is it even possible?

To "no do this" ? Yes, certainly <g>

More seriously: if your problem is to dynamically add a bunch of
methods to an existing *class*, it's quite easy - just import the
class and assign your functions to it, ie:

from otherlib import OtherClass

def foo(self):
print "%s.foo" % self


OtherClass.foo = foo

And voila, The "foo" method is now available to all (even already
existing) instances of OtherClass.

If this doesn't answer your question, please provide more context.

>  Can decorators be used
> here?

What for ?

bruno.des...@gmail.com

unread,
Dec 2, 2010, 12:26:53 PM12/2/10
to
On 2 déc, 15:45, Jeremy <jlcon...@gmail.com> wrote:
> On Dec 1, 10:47 pm, James Mills <prolo...@shortcircuit.net.au> wrote:
>
>
>
> > On Thu, Dec 2, 2010 at 3:36 PM, Jeremy <jlcon...@gmail.com> wrote:
> > > I have some methods that I need (would like) to define outside of the
> > > class.  I know this can be done by defining the function and then
> > > setting it equal to some member of an instance of the class.  But,
> > > because of the complexity of what I'm doing (I have to set many
> > > functions as class methods) I would rather not do this.  Can someone
> > > show me how to do this?  Is it even possible?  Can decorators be used
> > > here?
>
> > Do you mean something like this ?
>
> > @classmethod
> > def foo(cls):
> >     print "I am the foo classmethod on %r" % cls
>
> > class Foo(object):
> >     pass
>
> > Foo.foo = foo
>
> > cheers
> > James
>
> Thanks, James.  That is almost exactly what I want.  However, I want to avoid doing
>
> Foo.foo = foo
>
> Is this going to be possible?  

def patch(cls):
def _patch(func):
setattr(cls, func.__name__, func)
return func
return _patch

class Foo(object): pass


@patch(Foo)
def bar(self):
print self

f = Foo()
f.bar()


> I'm trying to understand how decorators
> are used.  Are they really necessary in this example?

In the above example, the classmethod type was used as a decorator to
turn the function into, well, a classmethod (read my other answer in
this thread if you don't know what a classmethod is).

Jeremy

unread,
Dec 2, 2010, 1:22:48 PM12/2/10
to
On Dec 2, 10:26 am, "bruno.desthuilli...@gmail.com"

Yes! This is what I was looking for. Thanks!

Jeremy

0 new messages