2017-05-14 323 views
0

我有以下代碼,但我想將其轉換爲模塊。 很顯然,如果我將此代碼作爲模塊丟失並且ser將永遠不會初始化,並且Agent類將不起作用。Python模塊全局變量

#module.py 

class Agent: 
    def __init__(self, a, b, c): 
     self.a = a 
     self.b = b 
     self.c = c 

    def send(self, data): 
     message = data + ' ' + a 
     ser.write(message) 

ser_r = serial.Serial(
        port='COM6', 
        baudrate=500000, 
        parity=serial.PARITY_NONE, 
        stopbits=serial.STOPBITS_ONE, 
        bytesize=serial.EIGHTBITS 
        ) 

ser = io.TextIOWrapper(io.BufferedRWPair(self.ser_raw, self.ser_raw, 1), 
        newline='\r', 
        line_buffering=True) 

於是我想出了一個主意,以創建具有ser變量,然後在Agent類使用Serial類。

但現在還有另一個問題:如何在Agent內部訪問Serial而不創建Serial的實例?用戶可以創建一個Serial實例,但是我不知道Agent中應該使用的名稱。我可以製作init方法,然後在裏面創建Serial類。導入用戶後,將調用init方法,然後他可以使用它。

#module.py 

class Agent: 
    def __init__(self, a, b, c): 
     self.a = a 
     self.b = b 
     self.c = c 

    def send(self, data): 
     message = data + ' ' + a 
     Serial.ser.write(message) 



class Serial: 
    ser_r = serial.Serial(
       port='COM6', 
       baudrate=500000, 
       parity=serial.PARITY_NONE, 
       stopbits=serial.STOPBITS_ONE, 
       bytesize=serial.EIGHTBITS 
      ) 

    ser = io.TextIOWrapper(io.BufferedRWPair(self.ser_raw, self.ser_raw, 1), 
           newline='\r', 
           line_buffering=True) 

回答

3

顯然,如果我導入此代碼模塊ser_rser將永遠不會被初始化,Agent類將無法正常工作。

不,這根本不明顯,事實上是錯誤的。導入模塊運行所有頂級代碼。這裏沒有問題,ser_rser與其他所有一起創建。

這裏的課程並不特別; class Serial: ...只是另一個頂級聲明,就像ser_rser分配聲明

請注意,該模塊爲該模塊中的所有代碼形成全局命名空間。在Agent.send()中,名稱ser是全局名稱,該名稱通過查看附加的模塊全局變量來解決,其中ser已經存在。

你確實有在代碼中的錯誤,但是:

ser = io.TextIOWrapper(io.BufferedRWPair(self.ser_raw, self.ser_raw, 1), 
        newline='\r', 
        line_buffering=True) 

沒有定義全局名稱self,所以self.ser_raw也不存在。也許你打算在ser_r左右創建包裝?

ser = io.TextIOWrapper(io.BufferedRWPair(ser_r, ser_r, 1), 
         newline='\r', line_buffering=True) 

這一切都意味着你實際上不必使用Serial類。它沒有狀態(只有類的屬性),所以你永遠不需要創建一個實例,你可以把它作爲一個全局的(因爲你的第二次嘗試已經)。因爲你已經可以從Agent().send()訪問全球Serial,所以不需要任何人使用你的模塊必須知道Serial或創建它的一個實例。

如果您不想讓串行連接成爲全局連接,您可以始終在Agent.__init__()中創建連接,或讓該類接受要寫入的合適對象io.TextIOBase