Class的方法没有看到全局变量

时间:2013-12-08 18:17:10

标签: 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)

我想在这个类的几个方法中使用self.USB变量作为全局变量。

def refreshTIME(dummy):
        dummy.USB.write('3')

我收到了一个错误:

self.USB
AttributeError: 'Window' object has no attribute 'USB'

它不应该是一个全局变量,并且在这个类的每个方法中都可见吗?

4 个答案:

答案 0 :(得分:1)

您不想在此处使用全局变量。一般来说,不鼓励使用全局变量,因为它们会导致混乱的意大利面条代码。

__init__方法中,您尝试访问实例变量USB。它在那时不存在所以你必须设置它:

class Window(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        self.USB = None # sets the variable
        self.USB        # accesses the variable

此外,setPort的代码设置本地变量USB的值,而不是实例变量的值。您可以使用self.USB执行此操作:

class Window(QtGui.QMainWindow):
    # ... rest of class ...

    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)

注意:您也不需要行末的\

最后,您应该能够访问USB实例变量:

def refreshTIME(dummy):
    dummy.USB.write('3')

myWindow = Window()
refreshTIME(myWindow)

您还应该考虑将refreshTIME函数作为方法放入Window类。

答案 1 :(得分:0)

在定义函数 init 时定义self.USB。

self.USB = "something"

答案 2 :(得分:0)

您应该在__init__方法中添加:

self.USB = None    # or give it another initial value 

然后,当您想在类的其他方法中使用此变量时,用法如下:

self.USB = xxx     # some opertations

答案 3 :(得分:-1)

我有这个代码,这是一种非常奇怪的方式来使用命名空间 这是你想做的事吗?

class A(object):
    def __init__(self,x):
        if x is None:
            self.name = 'unknown'
        else:
            self.name = x

print 'class A created'
print 'y' in dir()

class Window(A):
    def __init__(self,name, parent=None):
        super(Window, self).__init__(parent)
        self.name = name
        self.USB = ['SOME_thing']
        y = self.USB
        global y

print 'clas Window created'
print 'y' in dir()

w = Window('Try1')

print '\ninstance w created'
print 'y' in dir()

def refreshTIME(dummy=y):
    dummy[0] = dummy[0].lower()

print 'function refreshTime created'
print 'y' in dir()

print '------------'
print 'w.name ==',w.name
print 'w.USB ==',w.USB
print 'y ==',y
refreshTIME()
print 'w.name ==',w.name
print 'w.USB ==',w.USB
print 'y ==',y

结果

class A created
False
clas Window created
False

instance w created
True
function refreshTime created
True
------------
w.name == Try1
w.USB == ['SOME_thing']
y == ['SOME_thing']
w.name == Try1
w.USB == ['some_thing']
y == ['some_thing']