2014-03-13 5 views
2

내 실험실에 곧 새로운 장비가 추가되고 테스트 프로세스를 자동화하기 위해 자체 modbus 스크립트를 작성하고 있습니다. 지금까지, 이것은 제한된 프로그래밍 숙련도에 맞서야했던 가장 복잡한 작업입니다.__init __() 메소드 상속 및 수정

대신 명령을 관리하기 위해 처음부터 새로운 클래스를 작성, 나는 bytearray에서 그 기능을 상속하는 클래스 EZTcomm을하고 순환 중복 체크섬을 저장하는 EZTcomm.crc 속성을 추가하고 싶습니다.

this question과 docs.python.org를 읽은 후에도 저는이 작업을 수행하는 방법에 대해 여전히 혼란스러워합니다. 그것은 내 새 클래스에서 __init__() 메서드를 수정하려는 경우 우선 명시 적으로 bytearray.__init__() 호출해야하지만 bytearray.__init__()EZTcomm 호출에서 인수를 전달하는 방법을 알아낼 수 없으며 어떻게 알 수 있습니까 CRC를 계산하기위한 변수로 bytearray.__init__() 호출의 인수를 사용합니다.

이것은 내가 지금까지 쓴 것입니다 :이 어디 내가 그것을 원하는 방식으로 작업에 가까운

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가 일반 기능 1을 할 것을 권장합니다

__init__ 내부
class EZTcomm(bytearray): 

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

, 자기가 만들고있는 서브 클래스의 인스턴스입니다 : 당신이 당신의 서브 클래스의 init에서 호출

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 

. 그것은 bytearray이므로 CRC가 작동한다고 가정하고 CRC와 함께 작동해야합니다. 물론, 당신은 여기에 더 복잡하고 기본 클래스의 __init__ 메소드의 호출 할 super를 사용할 수 있습니다

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 행을 삭제합니다.

+0

'for '을'for'로 변경하고'n + = 1'을 삭제하십시오 – pat

+0

또한 이는 비효율적 인 CRC 구현입니다. 256 개 항목의 테이블을 미리 계산하여 내부 루프를 피할 수 있습니다. – pat

+0

@pat - 나는 그것이 ... OP 코드에 적용되어야하는 변경 사항에 맞습니다. 위와 같이 즉시 알아볼 수 있도록 남겨 두 겠지만 OP는 귀하의 의견을 적어두고 적절한 변경을 가할 것입니다. 나는 CRC가 무엇인지 모른다. 그래서이 구현이 작동한다는 당신의 말을 모두 취할 것이다. – mgilson

관련 문제