继承和修改__init__()方法



我的实验室即将接收一些新设备,我正在编写自己的modbus脚本来自动化测试过程。到目前为止,这是我以有限的编程能力所做的最复杂的任务。

而不是从头开始写一个新的类来管理命令,我想做一个类EZTcomm继承其功能从bytearray和添加一个EZTcomm.crc属性来存储循环冗余校验和。

在阅读了这个问题和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)

这是否接近我想要的工作方式?我应该做些什么改变?

你很接近了。您希望CRC是一个正则函数1:

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__中,self是你正在创建的子类的实例。它是一个字节数组,所以它应该与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/

1你的while循环最好是for循环:for n in range(8):... .
如果你这样做,你删除n = 0n += 1

相关内容

  • 没有找到相关文章

最新更新