2014-03-13 73 views
2

我的實驗室很快收到了一些新的裝備,我在寫我自己的MODBUS腳本來自動測試過程。到目前爲止,這是我必須保持有限編程能力的最複雜的任務。繼承和修改__init __()方法

不是從頭開始編寫一個新的類來管理命令的,我想使一個類EZTcommbytearray繼承了它的功能,並添加EZTcomm.crc屬性來存儲循環冗餘校驗。

閱讀this question和docs.python.org後,我還是真搞不清楚如何做到這一點。看來,如果我想在所有的修改__init__()方法在我的新的類,然後我需要顯式調用bytearray.__init__()第一,但我不知道如何來傳遞參數在EZTcomm調用bytearray.__init__(),我也不知道該怎麼使用bytearray.__init__()調用中的參數作爲變量來計算CRC。

這是我迄今寫的:

class EZTcomm(bytearray): 

    def __init__(self, *args, **kwargs): 
     bytearray.__init__(self, *args, **kwargs) 
     self.check = crc(args) 

    def CRC(bytearray_in): 
     '''Calculates a Cyclical Redundancy Checksum (CRC16).''' 
     crc = 0xFFFF 
     for work_byte in bytearray_in: 
      crc ^= work_byte 
      n = 0 
      while n in range(8): 
       if (crc & 0x0001): 
        crc >>= 1 
        crc ^= 0xA001 
       else: 
        crc >>= 1 
       n += 1 
     return crc 

############ 

test = EZTcomm([0x01,0x03,0x00,0x23,0x00,0x02]) 
print(test) 
print(test.check) 

這是望其項背工作,我希望它的方式?我應該做什麼不同?

+0

聽起來你仍然對如何使用參數有點困惑。看到這裏的文檔:http://docs.python.org/2/tutorial/controlflow.html#more-on-defining-functions –

回答

1

你很近。你想CRC是一個經常函數:

def CRC(bytearray_in): 
    '''Calculates a Cyclical Redundancy Checksum (CRC16).''' 
    crc = 0xFFFF 
    for work_byte in bytearray_in: 
     crc ^= work_byte 
     n = 0 
     while n in range(8): 
      if (crc & 0x0001): 
       crc >>= 1 
       crc ^= 0xA001 
      else: 
       crc >>= 1 
      n += 1 
    return crc 

你從你的子類的init撥打:

class EZTcomm(bytearray): 

    def __init__(self, *args, **kwargs): 
     bytearray.__init__(self, *args, **kwargs) 
     self.check = CRC(self) 

__init__,自我是你的子類,你正在創建的實例。這是一個字節陣列,所以它應該與CRC一起工作,假設CRC完全起作用。當然,你可以得到更復雜這裏使用super做基類的__init__方法的調用:

class EZTcomm(bytearray): 

    def __init__(self, *args, **kwargs): 
     super(EZTcomm, self).__init__(*args, **kwargs) 
     # super().__init__(*args, **kwargs) # python3.x only. 
     self.check = CRC(self) 

super的優點是,它使事情有多重繼承的工作很好,但在一般情況下,我建議人們在開始搞亂之前真的知道自己在做什麼。爲了充分利用它,您應該遵循一些最佳做法。有關詳細信息,請參閱:http://rhettinger.wordpress.com/2011/05/26/super-considered-super/

while循環將作爲for循環更好:for n in range(8):...
如果你這樣做,你刪除n = 0n += 1行。

+0

更改'while'爲'for'並刪除'N + = 1' – pat

+0

此外,這是一個低效率的CRC實施。您可以通過預先計算256個條目表來避免內部循環。 – pat

+0

@pat - 我確定這是......你對OP應該做的修改是正確的。我要離開它,因爲它可以立即從上面識別出來,但希望OP會記下您的意見並進行適當的更改。我不知道什麼是CRC,所以我會認爲這個實現有效(至少)。 – mgilson