这是我的代码的一部分:
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作为值。
我尝试了不同的替代方案,但仍然无法正常工作。
答案 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))