重用变量的困难

时间:2015-05-20 08:56:48

标签: python user-interface pyqt

这是我的代码的一部分:

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

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

3 个答案:

答案 0 :(得分:3)

你在这里遇到了多个问题。

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

valCouche = nameCouche()

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

此外,您在课程定义时运行此操作。这意味着没有self - 还没有任何实例self - 因此您无法调用nameCouche之类的方法{1}},因为你没有任何东西可以调用它。

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

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

然后,如果您希望稍后在其他方法中访问此值,则必须以self.valCouche方式访问该值。

如果您进行了这些更改,它将工作。但是你的对象模型仍然没有多大意义。为什么nameCouche是一种方法,当它与对象没有任何关系,并且不能访问它的任何属性时?也许它作为一个@staticmethod是有意义的,但实际上,我认为它更有意义,就像课外的普通函数一样。实际上,您编写的代码中的 none 似乎与该类有关。

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

答案 1 :(得分:0)

你必须在__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))

答案 2 :(得分:-1)

你必须定义一个初始化函数: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))