我的实验室很快就会收到一些新设备,我正在编写自己的modbus脚本来自动化测试过程。到目前为止,这是我必须克服我有限的编程熟练程度的最复杂的任务。
我没有从头开始编写新类来管理命令,而是希望创建一个继承EZTcomm
功能的类bytearray
并添加EZTcomm.crc
属性存储Cyclical Redundancy Checksum。
在阅读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 :(得分:1)
你很亲密。您希望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是您正在创建的子类的实例。它是一个bytearray,所以它应该与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):...
。
如果这样做,你放弃{{1 }和n = 0
行。