guy16
guy16

Reputation: 233

Difficulties with re-using a variable

here is a part of my code :

class projet(object):

    def nameCouche(self):

        valLissage = float(ui.valLissage.displayText())    
        return (valLissage)         
    valCouche = nameCouche() # asks for a positional argument but 'self' doesnt work   

    def choixTraitement(self):
        ui.okLissage.clicked.connect(p.goLissage)

    def goLissage(self, valCouche):
        if ui.chkboxLissage.isChecked():
            print(valCouche) # result is False
            os.system(r'"C:\Program Files\FME\fme.exe" D:\Stelios\..... --MAX_NUM_POINTS {0}'.format(valCouche))

So I would like to use valCouche in goLissage method but it doesnt work. I thought that valCouche would have the argument of valLissage but instead it gives False as a value. I've tried different alternatives but still doesnt work.

Upvotes: 0

Views: 67

Answers (3)

abarnert
abarnert

Reputation: 365787

You've got multiple problems here.

First, if you write this in the middle of a class definition:

valCouche = nameCouche()

... you're creating a class attribute, which is shared by all instances, not a normal instance attribute.

Also, you're running this at class definition time. That means there is no self yet--there aren't any instances yet to be self--so you can't call a method like nameCouche, because you don't have anything to call it on.

What you want to do is call the method at instance initialization time, on the instance being initialized, and store the return value in an instance attribute:

def __init__(self):
    self.valCouche = self.nameCouche()

Then, when you want to access this value in another method later, you have to access it as self.valCouche.


If you make those changes, it will work. But your object model still doesn't make much sense. Why is nameCouche a method when it doesn't have anything to do with the object, and doesn't access any of its attributes? Maybe it makes sense as a @staticmethod, but really, I think it makes more sense just as a plain function outside the class. In fact, none of the code you've written seems to have anything to do with the class.

This kind of cram-everything-into-the-class design is often a sign that you're trying to write Java code in Python, and haven't yet really understood how Python does OO. You might want to read a good tutorial on Python classes. But briefly: if you're writing a class just to have somewhere to dump a bunch of vaguely-related functions, what you want is a module, not a class. If you have some reason to have instances of that class, and the functions all act on the data of each instance, then you want a class.

Upvotes: 3

Narcisse Doudieu Siewe
Narcisse Doudieu Siewe

Reputation: 649

you have to define an initialization function: def__init__(self) defining valCouche as an instance attribute make it accessible on all the method so we have the following

class projet(object):

    def __init__(self):
        self.valCouche = ''

    def nameCouche(self):
        self.valCouche =  float(ui.valLissage.displayText())

    @staticmethod #here there is no need for self so it is a method of class
    def choixTraitement():
        ui.okLissage.clicked.connect(p.goLissage)

    def goLissage(self):
        if ui.chkboxLissage.isChecked():
           print(self.valCouche) # result is False
           os.system(r'"C:\Program Files\FME\fme.exe" D:\Stelios\..... --MAX_NUM_POINTS {0}'.format(self.valCouche))

Upvotes: -1

Nerkyator
Nerkyator

Reputation: 3976

You have to declare variabile in the __init__ method (constructor) and then use it in your code

ex:

class projet(object):
    def __init__(self):
        self.valCouche = ''

    def nameCouche(self):
        valLissage = float(ui.valLissage.displayText())     
        return (valLissage)         


    def choixTraitement(self):
        ui.okLissage.clicked.connect(p.goLissage)

    def goLissage(self, valCouche):
        if ui.chkboxLissage.isChecked():
            self.valCouche = self.nameCouche() 
            print(self.valCouche) # result is False
            os.system(r'"C:\Program Files\FME\fme.exe" D:\Stelios\..... --MAX_NUM_POINTS {0}'.format(self.valCouche))

Upvotes: 0

Related Questions