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?
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.
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?
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)
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 st*****@midwinter.ca st***************@gmail.com 5 2050
Here's what I came up with:
#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)
print 'afterwards, a is', self.a.call(self.a)
class second:
def __init__(self, a):
pass
def call(self, a):
a = 'aa'
return a
if __name__ == '__main__':
app = first()
app.update()
Not sure if this is what you are wanting though.
> 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?
Sure it can. But your code shows that you suffer from a fundamental
misunderstanding on how variables and values work in python. Don't be to
worried about that, it happens to quite a few people.
A variable in python is just a name refering to an object. So this a = 'a' b = a print a, b
a a
will make a and b both refer to the string 'a'. Now assigning a different
value to b will not affect the binding of a:
b = 10 print a, b
a 10
So that is the reason you obeserve the behaviour you've seen. Now the
question is how to accomplish your desired goal? The answer is simple:
don't rebind a value to a name - alter the value! In python, there is a
distinction between mutable objects and immutable ones. Strings and numbers
are of the latter kind, lists and dicts and objects of the former. So if we
changed our example slighly, things start working as you'd expect:
a = ['a'] b = a print a,b
['a'] ['a'] b[0] = 10 print a, b
[10] [10]
So if you pass the same _mutable_ object to two objects, and one of them
changes it, the other one will see the changes:
class A:
def __init__(self):
self.a_list = [0]
class B:
def __init__(self, l):
self.l = l
def foo(self):
self.l.append(100)
a = A()
b = B(a.a_list)
b.foo()
print a.a_list
-> [0, 100]
There are some resources on the web that explain this in more thourough
detail - but curretntly I have trouble finding them. Search this newsgroup.
--
Regards,
Diez B. Roggisch
On 2005-03-06, Stewart Midwinter <st***************@gmail.com> 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?
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.
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?
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.
Depends a bit on who is updating who and which is
created first and which needs references to which.
Maybe like this...
--- #objtest.py
class first:
def __init__(self, a):
self.a = a
print 'a initialized to', self.a
self.updater = second(self)
def update(self, a='aa'):
print 'initially, a is', self.a
self.updater.do_update(a)
print 'afterwards, a is', self.a
class second:
def __init__(self, lst):
self.lst = lst
def do_update(self, a):
self.lst.a = a
if __name__ == '__main__':
lst = first('a')
lst.update()
# or ...
dlg = second(lst)
lst.update('aaa')
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 st*****@midwinter.ca st***************@gmail.com
thanks guys. Three good answers, each slightly different, but giving me
good food for thought.
Obviously my example was a trivial one, but I wanted to isolate the
behaviour I'm seeing in my real app. I now have some good ideas for
moving forward!
cheers
S This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Max Ischenko |
last post by:
Hi,
I wrote simple implementation of the "synchronized" methods (a-la Java),
could you please check if it is OK:
def synchronized(method):
"""
Guards method execution, similar to Java's...
|
by: Andy |
last post by:
Hi
Could someone clarify for me the method parameter passing
concept?
As I understand it, if you pass a variable without
the "ref" syntax then it gets passed as a copy.
If you pass a...
|
by: daniel.w.gelder |
last post by:
I wrote a template class that takes a function prototype and lets you
store and call a C-level function, like this:
inline string SampleFunction(int, bool) {..}
functor<string (int, bool)>...
|
by: JohnR |
last post by:
From reading the documentation, this should be a relatively easy thing. I
have an arraylist of custom class instances which I want to search with
an"indexof" where I'm passing an instance if the...
|
by: gregory.petrosyan |
last post by:
Hello everybody!
I have little problem:
class A:
def __init__(self, n):
self.data = n
def f(self, x = ????)
print x
All I want is to make self.data the default argument for self.f(). (I
|
by: zzw8206262001 |
last post by:
Hi,I find a way to make javescript more like c++ or pyhon
There is the sample code:
function Father(self) //every contructor may have "self"
argument
{
self=self?self:this; ...
|
by: lukasmazur |
last post by:
Hi
I have a problem with using listBox1. I have a two forms form1 and
form2. In form1 are controls listBox1, textBox1 and button witch
creating object of class Form2. In class Form2 I create a...
|
by: VK |
last post by:
<OT>I am finishing TransModal 0.1 so planning to move it from alpha to
beta stage.<OT>
Besides that I am planning to write an introductory to inheritance
schema currently used in Javascript...
|
by: raylopez99 |
last post by:
I'm posting this fragment from another thread to frame the issue
clearer.
How to pass an object to a function/method call in C# that will
guarantee not to change the object?* In C++, as seen...
|
by: DolphinDB |
last post by:
Tired of spending countless mintues downsampling your data? Look no further!
In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
|
by: ryjfgjl |
last post by:
ExcelToDatabase: batch import excel into database automatically...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM).
In this month's session, we are pleased to welcome back...
|
by: Vimpel783 |
last post by:
Hello!
Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
|
by: jfyes |
last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
|
by: PapaRatzi |
last post by:
Hello,
I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
|
by: CloudSolutions |
last post by:
Introduction:
For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
|
by: Defcon1945 |
last post by:
I'm trying to learn Python using Pycharm but import shutil doesn't work
|
by: Shællîpôpï 09 |
last post by:
If u are using a keypad phone, how do u turn on JavaScript, to access features like WhatsApp, Facebook, Instagram....
| |