重用变量的困难



这是我的一部分代码:

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 FilesFMEfme.exe" D:Stelios..... --MAX_NUM_POINTS {0}'.format(valCouche))

所以我想在goLissage方法中使用valCouche,但它不起作用。我认为valCouche会有valLissage的参数,但它给出了False作为值。我已经尝试了不同的替代方案,但仍然不起作用

你有很多问题。

首先,如果你把这个写在类定义的中间:

valCouche = nameCouche()

…您正在创建一个类属性,它是由所有实例共享的,而不是普通的实例属性。

同样,您在类定义时运行它。这意味着还没有self——还没有self的实例——所以你不能调用像nameCouche这样的方法,因为你没有任何东西可以调用它。

你要做的是在实例初始化时调用该方法,在实例初始化时,并将返回值存储在实例属性中:

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

然后,当你想在以后的其他方法中访问这个值时,你必须访问它作为self.valCouche


如果你做了这些更改,它将工作。但是你的对象模型仍然没有多大意义。为什么nameCouche是一个方法时,它没有任何关系的对象,不访问其任何属性?也许它作为@staticmethod是有意义的,但实际上,我认为它更有意义,只是作为类外的普通函数。事实上,您所编写的代码中没有看起来与类有任何关系。

这种将所有东西都塞进类的设计通常表明您正在尝试用Python编写Java代码,并且还没有真正理解Python如何实现OO。您可能需要阅读有关Python类的优秀教程。但简单地说:如果你写一个类只是为了有一个地方转储一堆模糊相关的函数,你想要的是一个模块,而不是一个类。如果你有理由拥有该类的实例,并且这些函数都作用于每个实例的数据,那么你需要一个类。

你必须在__init__方法(构造函数)中声明变量,然后在你的代码中使用它

,

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 FilesFMEfme.exe" D:Stelios..... --MAX_NUM_POINTS {0}'.format(self.valCouche))

你必须定义一个初始化函数:def__init__(self)将valCouche定义为实例属性,使其在所有方法上都可访问,因此我们有如下

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 FilesFMEfme.exe" D:Stelios..... --MAX_NUM_POINTS {0}'.format(self.valCouche))

相关内容

  • 没有找到相关文章

最新更新