Python Forum
Have two class instances affect one another - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Have two class instances affect one another (/thread-19393.html)



Have two class instances affect one another - The_Zookinator - Jun-26-2019

Hey everybody,

newbe here. I'm trying out classes and I don't know how to get the desired results:

class name():
    def __init__(self,name):
        self.name = name
        self.m = 0
    def one(self):
        if self.name == 'Jack':
            self.m = self.m + 5
            print(self.m)
    
    def two(self):
        if self.m > 0:
            print(self.m)
        else:
            print("no")
S = name('Jack')
P = name('Tom')
I want to start with S.one() and then use P.two() to get 5 but I always get 'no' instead.
Any feedback is welcome and appriciated Big Grin


RE: Have two class instances affect one another - nilamo - Jun-26-2019

So depending on exactly what you want, there's several ways to do it. The easiest would be to use a shared object to store the dependent data:
>>> class DataBag:
...   def __init__(self):
...     self.m = 0
...

>>> class Foo:
...   def __init__(self, name, data):
...     self.name = name
...     self.data = data
...   def one(self):
...     if self.name == "Jack":
...       self.data.m += 5
...   def two(self):
...     if self.data.m > 0:
...       print(self.data.m)
...     else:
...       print("no")
...
>>> bag = DataBag()
>>> s = Foo("Jack", bag)
>>> p = Foo("Tom", bag)
>>> s.one()
>>> p.two()
5
You could also use a class member instead of an instance variable, if you want to effect ALL instances of the class, not just these two:
>>> class Bar:
...   m = 0
...   def __init__(self, name):
...     self.name = name
...   def one(self):
...     if self.name == "Jack":
...       Bar.m += 5
...   def two(self):
...     if Bar.m > 0:
...       print(Bar.m)
...     else:
...       print("no")
...
>>> a = Bar("Jack")
>>> b = Bar("Fred")
>>> b.two()
no
>>> a.one()
>>> b.two()
5
I'd recommend the first, though, unless you have a good (and obvious) reason why all instances should have the same values.


RE: Have two class instances affect one another - avorane - Jun-26-2019

Hello,

I think it's right like result.

You set name of S to Jack and call one on this. So attribut m equal 5.

You set name of P with other value. So attribut m equal 0.

And you call two on P. It returns 'no' if m equal 0. This is the case.

Sorry, i have read the subject too fast.

I don't know if can it a solution, but you have the design pattern singleton for this.

You can found this on the web for python


RE: Have two class instances affect one another - The_Zookinator - Jun-26-2019

I actually do need all instances to have the same values so thanks a lot nilamo :)