繁体   English   中英

重用变量的困难

[英]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而是它提供虚假的价值。 我尝试了其他替代方法,但仍然无法正常工作。

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

首先,如果您在类定义的中间编写此代码:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM