Python Forum

Full Version: Have two class instances affect one another
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
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
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.
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
I actually do need all instances to have the same values so thanks a lot nilamo :)