重用变量的困难

Difficulties with re-using a variable

这是我的代码的一部分:

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))

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

您必须在 __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 Files\FME\fme.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 Files\FME\fme.exe" D:\Stelios\..... --MAX_NUM_POINTS {0}'.format(self.valCouche))

你这里有多个问题。

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

valCouche = nameCouche()

...您正在创建一个 class 属性,该属性由所有实例共享,而不是普通实例属性。

此外,您在 class 定义时 运行 这个。这意味着 还没有 self——还没有任何实例要成为 self——所以你不能调用像 nameCouche,因为你没有什么可以调用它的。

您要做的是在实例初始化时调用正在初始化的实例上的方法,并将 return 值存储在实例属性中:

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

然后,当你以后想在另一个方法中访问这个值时,你必须以 self.valCouche.

的形式访问它

如果您进行这些更改,它将 起作用 。但是您的对象模型仍然没有多大意义。为什么 nameCouche 是一个与对象没有任何关系并且不访问其任何属性的方法?也许它作为 @staticmethod 有意义,但实际上,我认为它作为 class 之外的普通函数更有意义。实际上,您编写的代码的 none 似乎与 class 有任何关系。

这种把所有东西都塞进 class 的设计通常表明您正试图在 Python 中编写 Java 代码,但还没有但真正了解 Python 是如何面向对象的。您可能想阅读有关 Python classes 的很​​好的教程。但简而言之:如果您编写 class 只是为了在某个地方转储一堆模糊相关的函数,那么您需要的是一个模块,而不是 class。如果您有某种理由需要 class 的实例,并且函数都作用于每个实例的数据,那么您需要一个 class.