这是我的一部分代码:
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))