在Python中,类中的方法无法访问全局变量。这可能会导致一些问题,例如无法在类的方法中使用全局变量存储的数据。
考虑以下代码:
class Window(QtGui.QMainWindow):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.USB
def setPort(self, text):
if text == 'ttyUSB0':
USB = serial.Serial(
port='/dev/ttyUSB0',\
baudrate=9600,\
parity=serial.PARITY_NONE,\
stopbits=serial.STOPBITS_ONE,\
bytesize=serial.EIGHTBITS,\
writeTimeout=0)
def refreshTIME(dummy):
dummy.USB.write('3')
在上面的代码中,我们创建了Window类,其中有一个__init__方法和一个setPort方法。在__init__方法中,我们尝试访问全局变量USB,但会报错,提示“AttributeError: 'Window' object has no attribute 'USB'”。
## 2. 解决方案
解决这个问题的一种方法是将USB变量作为类属性,而不是全局变量。这样,类中的所有方法都可以访问该变量。
修改后的代码如下:
```python
class Window(QtGui.QMainWindow):
USB = None # Sets the variable
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.USB = serial.Serial(
port='/dev/ttyUSB0',\
baudrate=9600,\
parity=serial.PARITY_NONE,\
stopbits=serial.STOPBITS_ONE,\
bytesize=serial.EIGHTBITS,\
writeTimeout=0)
def setPort(self, text):
if text == 'ttyUSB0':
self.USB = serial.Serial(
port='/dev/ttyUSB0',\
baudrate=9600,\
parity=serial.PARITY_NONE,\
stopbits=serial.STOPBITS_ONE,\
bytesize=serial.EIGHTBITS,\
writeTimeout=0)
def refreshTIME(self):
self.USB.write('3')
在修改后的代码中,我们首先将USB变量作为类属性进行初始化。然后,我们在__init__方法中对USB变量进行赋值。这样,类中的所有方法都可以访问USB变量了。
你也可以将refreshTIME函数作为Window类的方法,这样就可以在类中调用它。
```python
class Window(QtGui.QMainWindow):
USB = None # Sets the variable
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.USB = serial.Serial(
port='/dev/ttyUSB0',\
baudrate=9600,\
parity=serial.PARITY_NONE,\
stopbits=serial.STOPBITS_ONE,\
bytesize=serial.EIGHTBITS,\
writeTimeout=0)
def setPort(self, text):
if text == 'ttyUSB0':
self.USB = serial.Serial(
port='/dev/ttyUSB0',\
baudrate=9600,\
parity=serial.PARITY_NONE,\
stopbits=serial.STOPBITS_ONE,\
bytesize=serial.EIGHTBITS,\
writeTimeout=0)
def refreshTIME(self):
self.USB.write('3')
myWindow = Window()
myWindow.refreshTIME()
在上面的代码中,我们创建了一个Window类的实例,然后调用了refreshTIME方法。