How can I define class methods outside of the class?

J

Jeremy

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
 
J

James Mills

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
 
I

Ian Kelly

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
 
J

Jeremy

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
 
B

bruno.desthuilliers

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"
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 ?
 
B

bruno.desthuilliers

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).
 
J

Jeremy

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()

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

Jeremy
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top