2013-12-08 65 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