Can a method in one class change an object in another class?

Kent Johnson kent37 at tds.net
Sun Mar 6 14:54:18 CET 2005


Stewart Midwinter wrote:
> I've got an app that creates an object in its main class (it also
> creates a GUI).  My problem is that I need to pass this object, a
> list, to a dialog that is implemented as a second class. I want to
> edit the contents of that list and then pass back the results to the
> first class.   So my question is, can a method in one class change an
> object in another class?

Diez and Lee have shown you two ways to do this.

> If the answer is no, I suppose I could pass in the list as an argument
> when I create the second class, then return the contents of the list
> when I end the methods in that second class.

This is almost what your example does, but you have made a small error. See below.

> alternatively, I could make the list a global variable, then it would
> be available to all classes.  I have a nagging feeling though that
> global variables are to be avoided on general principle. Is this
> correct?

Yes, it is correct.

> Here's a simple example app that tries to have one class change the
> object in another class.  It doesn't give the behaviour I want,
> though.
> 
> ---
> #objtest.py
> 
> class first:
>     def __init__(self):
>         a = 'a'
>         self.a = a
>         print self.a
> 
>     def update(self):
>         print 'initially, a is', self.a
>         self.a = second(self.a)

The line above is creating an instance of second and assigning it to self.a. What you want to do is 
create an instance of second, *call* it, and assign the result to self.a. So you should have
           self.a = second(self.a)(self.a)

The self.a parameter passed to second is never used. If you change second.__init__ to
       def __init__(self):
           pass

then the call in update() will be
           self.a = second()(self.a)

Kent
>         print 'afterwards, a is', self.a
> 
> class second:
>     def __init__(self, a):
>         pass
> 
>     def __call__(self, a):
>         a = 'aa'
>         return a
> 
> if __name__ == '__main__':
>     app = first()
>     app.update()
> 
> thanks,
> --
> Stewart Midwinter
> stewart at midwinter.ca
> stewart.midwinter at gmail.com



More information about the Python-list mailing list