Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Why instancemethod when I can add functions to classes outside class body?

Reply
Thread Tools

Why instancemethod when I can add functions to classes outside class body?

 
 
Rim
Guest
Posts: n/a
 
      07-25-2003
Hi,

It appears to me the simplest way to add a function to a class outside
of the class declaration is as follows:

>>> class a(object):

.... pass
....
>>> def f(self):

.... print 'hi'
....
>>> a.f = f
>>> b=a()
>>> b.f()

hi

It works even when the class and the function are in defined in
different modules,
and the call to the method in a third module.

So what problem is the new.instancemethod() trying to solve?

It is ok to point me to a PEP or the like.

Thanks,
- Rim
 
Reply With Quote
 
 
 
 
Martin v. =?iso-8859-15?q?L=F6wis?=
Guest
Posts: n/a
 
      07-25-2003
http://www.velocityreviews.com/forums/(E-Mail Removed) (Rim) writes:

> So what problem is the new.instancemethod() trying to solve?


It has no side effects on the class it is an instancemethod of.

Regards,
Martin
 
Reply With Quote
 
 
 
 
Ben Finney
Guest
Posts: n/a
 
      07-25-2003
On 25 Jul 2003 07:18:15 +0200, Martin v. L÷wis wrote:
> (E-Mail Removed) (Rim) writes:
>> So what problem is the new.instancemethod() trying to solve?

>
> It has no side effects on the class it is an instancemethod of.


So what side effects (i.e. what problem) is the new.instancemethod()
trying to solve?

--
\ "I spent a lot of money on wine and women, and like a fool I |
`\ squandered the rest." -- Benny Hill |
_o__) |
http://bignose.squidly.org/ 9CFE12B0 791A4267 887F520C B7AC2E51 BD41714B
 
Reply With Quote
 
Anders J. Munch
Guest
Posts: n/a
 
      07-25-2003
"Ben Finney" <(E-Mail Removed)> wrote:
> On 25 Jul 2003 07:18:15 +0200, Martin v. L÷wis wrote:
> > (E-Mail Removed) (Rim) writes:
> >> So what problem is the new.instancemethod() trying to solve?

> >
> > It has no side effects on the class it is an instancemethod of.

>
> So what side effects (i.e. what problem) is the new.instancemethod()
> trying to solve?


Assigning to the class changes the behaviour of all instances of that
class. new.instancemethod can be used to add a method to an
individual instance.

>>> class A: pass

....
>>> a1 = A(); a2 = A()
>>> a1.f = new.instancemethod(lambda self: "hi", a1, A)
>>> a2.f()

Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: A instance has no attribute 'f'
>>> a1.f()

'hi'


- Anders


 
Reply With Quote
 
Terry Reedy
Guest
Posts: n/a
 
      07-25-2003

"Anders J. Munch" <(E-Mail Removed)> wrote in message
news:3f210717$0$76049$(E-Mail Removed) k...
> "Ben Finney" <(E-Mail Removed)>

wrote:
> > On 25 Jul 2003 07:18:15 +0200, Martin v. L÷wis wrote:
> > > (E-Mail Removed) (Rim) writes:
> > >> So what problem is the new.instancemethod() trying to solve?
> > >
> > > It has no side effects on the class it is an instancemethod of.

> >
> > So what side effects (i.e. what problem) is the

new.instancemethod()
> > trying to solve?

>
> Assigning to the class changes the behaviour of all instances of

that class.

Since changing the behavior of all instances is precisely the purpose
of making such an assignment (of function to class as method), that is
a feature, not a problem.

> new.instancemethod can be used to add a method to an individual

instance.
>
> >>> class A: pass

> ...
> >>> a1 = A(); a2 = A()
> >>> a1.f = new.instancemethod(lambda self: "hi", a1, A)
> >>> a2.f()

> Traceback (most recent call last):
> File "<stdin>", line 1, in ?
> AttributeError: A instance has no attribute 'f'
> >>> a1.f()

> 'hi'


So to answer the OP's question, the problem solved is that directly
assigning a function as an instance attribute binds the function as a
function, which means no *automatic* access to the instance and its
other attributes. If such access is needed, the instance must be
passed explicitly, as in
a1.f = lambda self: repr(self)
a1.f(a1)

Instancemethod adds the option of wrapping instance-specific functions
as bound methods getting the instance as an automatic first (self)
paramater, just like with class-wide methods. In the 'hi' example
above, since the self (psuedo)param is is ignored,
a1.f = lambda: 'hi'
would have the same net effect. However,
a1.f = new.instancemethod(lambda self: repr(self), a1, A)
requires the wrapping to avoid having to explicitly pass the instance.

Terry J. Reedy


 
Reply With Quote
 
Martin v. =?iso-8859-15?q?L=F6wis?=
Guest
Posts: n/a
 
      07-25-2003
"Terry Reedy" <(E-Mail Removed)> writes:

> So to answer the OP's question, the problem solved is that directly
> assigning a function as an instance attribute binds the function as a
> function, which means no *automatic* access to the instance and its
> other attributes.


To *really* answer the OP's question: API, in general, has no purpose
- it has a function. Whether that function is useful for something
depends on the application. So APIs don't try to solve problems
themselves - it is the developers who solve the problems using the API.

So one may ask "what is the problem that could be solved using
new.instancemethod". These questions often don't have good answers,
and I believe yours isn't much better than that the problem being
solved is

"Create an object of type instancemethod, given the function, the
instance, and the class."

Whether it is useful to create such objects depends on the
application.

Regards,
Martin

 
Reply With Quote
 
Rim
Guest
Posts: n/a
 
      07-28-2003
"Terry Reedy" <(E-Mail Removed)> wrote in message
> > >>> class A: pass

> ...
> > >>> a1 = A(); a2 = A()
> > >>> a1.f = new.instancemethod(lambda self: "hi", a1, A)
> > >>> a2.f()

> > Traceback (most recent call last):
> > File "<stdin>", line 1, in ?
> > AttributeError: A instance has no attribute 'f'
> > >>> a1.f()

> > 'hi'

>
> So to answer the OP's question, the problem solved is that directly
> assigning a function as an instance attribute binds the function as a
> function, which means no *automatic* access to the instance and its
> other attributes. If such access is needed, the instance must be


I don't understand why you say "no automatic access". If you examine
the following, I have access to the attributes defined in the class,
without doing anything special:

>>> class a:

.... def __init__(self,name):
.... self.msg = "hi"
.... self.name = name
....
>>> def f(self):

.... print "hello"
.... print self.msg
.... print self.name
....
>>> a.f = f
>>> b=a("Joe")
>>> b.f()

hello
hi
Joe

I obviously don't understand what you are trying to explain to me.

>So to answer the OP's question, the problem solved is that directly
>assigning a function as an instance attribute binds the function as a
>function, which means no *automatic* access to the instance and its
>other attributes. If such access is needed, the instance must be
>passed explicitly, as in
>a1.f = lambda self: repr(self)
>a1.f(a1)
>
>Instancemethod adds the option of wrapping instance-specific functions
>as bound methods getting the instance as an automatic first (self)
>paramater, just like with class-wide methods. In the 'hi' example



I think someone should write the official definitions for the following
so we all talk the same language:
- function
- method
- bound method/function
- unbound method/function
- class-wide method/function
- class-not-wide method/function
- etc.

> requires the wrapping to avoid having to explicitly pass the instance.


I did not pass the instance and it worked in my example. I'd like to understand
what you are trying to show me.

Thanks,
-Rim
 
Reply With Quote
 
Terry Reedy
Guest
Posts: n/a
 
      07-28-2003

"Rim" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed) om...
> "Terry Reedy" <(E-Mail Removed)> wrote in message
> > So to answer the OP's question, the problem solved is that

directly
> > assigning a function as an instance attribute binds the function

as a
> > function, which means no *automatic* access to the instance and

its
> > other attributes.


> I don't understand why you say "no automatic access".


Re-read the sentence again. The key point is 'assign ... as instance
attribute'.

> If you examine
> the following, I have access to the attributes defined in the class,
> without doing anything special:
>
> >>> class a:

> ... def __init__(self,name):
> ... self.msg = "hi"
> ... self.name = name
> ...
> >>> def f(self):

> ... print "hello"
> ... print self.msg
> ... print self.name
> ...
> >>> a.f = f


a is the class, not an instance, making the new class attribute f a
method just as if it has been part of the class statement.

> >>> b=a("Joe")
> >>> b.f()

> hello
> hi
> Joe


Try b.f = f instead and then call b.f() and b.f(b).

Now try b.f = new.instancemethod(f) and then call b.f() and b.f(b).

The results should answer your questions.

Terry J. Reedy

> >So to answer the OP's question, the problem solved is that directly
> >assigning a function as an instance attribute binds the function as

a
> >function, which means no *automatic* access to the instance and its
> >other attributes. If such access is needed, the instance must be
> >passed explicitly, as in
> >a1.f = lambda self: repr(self)
> >a1.f(a1)
> >
> >Instancemethod adds the option of wrapping instance-specific

functions
> >as bound methods getting the instance as an automatic first (self)
> >paramater, just like with class-wide methods. In the 'hi' example



 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
help with pix inside->outside + dmz->outside + inside->outside->dmz Jack Cisco 0 09-19-2007 01:57 AM
findcontrol("PlaceHolderPrice") why why why why why why why why why why why Mr. SweatyFinger ASP .Net 2 12-02-2006 03:46 PM
can't pickle instancemethod objects Jim Lewis Python 6 07-09-2006 09:07 PM
Why is there no instancemethod builtin? John Reese Python 15 06-20-2005 08:26 AM
'class' argument optional for new.instancemethod? Martin Miller Python 1 03-12-2005 01:31 AM



Advertisments