2013-12-08 91 views
-1

我有一个类:类的方法,不看全局变量

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' 

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

+0

为什么会出现'在''设置()''定义'self''。这个名字是用来定义方法的强大惯例。写这篇文章,你会引出这样一个想法:“set()”应该是一种方法,但它是在类之外缩进的。所以呢 ? – eyquem

回答

0

定义self.USB,同时定义函数init

self.USB = "something" 
+0

它说:NameError:name'self'未定义 – erbal

+0

您需要完整的代码示例(该行代码+周围的__init__方法)。 –

0

你应该在__init__方法补充一点:

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

然后,当你想使用在类的其他方法这个变量,用法是这样的:

self.USB = xxx  # some opertations 
+0

它说:NameError:name'self'未定义 – erbal

+0

@erbal,这个异常发生在'setPort'函数行吗? – flyer

+0

似乎USB并没有在setPort中获得新的值,这就是为什么现在我得到这个错误:AttributeError:'NoneType'对象没有'写'属性 – erbal

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类的方法。

+0

''self.USB''单独定义一个函数什么都没有意思 – eyquem

+0

@eyquem它不是一个函数,它是一个函数方法,我更新了代码示例以使其更清晰 –

+0

有\ simbols,在复制到此处时它会消失。当推送QPushButton时,refreshTIME应该工作。这就是为什么我想要所有的东西(按钮,方法,这发生在每次点击)放在一个类。不幸的是,问题仍然存在。 – erbal

-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'] 
+0

我想知道我的回答中有什么值得评论的,而不是沉默寡言的。 OP的问题对我来说看起来很尴尬,所以我的回答也很奇怪。这并不意味着我支持这种编码方式。 – eyquem