2014-03-13 34 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