2017-04-02 3 views
0

私は次のような状況があります。Applicationdataをヘッダーとフッターに置き、checksumを追加してpacketを追加します。 TCPApplicationから継承し、Applicationから得られたpacket(すなわち、super~make_packetを呼び出してそれ自身のものにする)とまったく同じ手順を実行します。複数クラスの共通関数の書き換えを避ける

make_packetコードは、ヘッダーとフッターの値を除いて、両方のクラスで同じなので、私は以下のようにクロージャを使用しようとしました。以下 重要な行はcmake_packetself.packet = cls_name.header + self.packet + cls_name.footer次のとおりです。

def make_make_packet(cls_name): 
    def cmake_packet(self): 
     self.packet = cls_name.header + self.packet + cls_name.footer 
     checksum = self.packet[::-1] 
     self.packet += checksum 
     return self.packet 

    return cmake_packet() 


class Application: 
    header = footer = "001101" 

    def __init__(self, data): 
     self.packet = data 

    make_packet = make_make_packet(Application) 


class TCP(Application): 
    header = footer = "110011" 

    def __init__(self, data): 
     super().__init__(data) 
     self.packet = super().make_packet() 

    make_packet = make_make_packet(TCP) 

とネットワークを介してデータのパケットを送信するために、私はちょうど呼び出し:

# data is something like "010" 
tlayer = TCP(data) 
# or send() 
print(tlayer.make_packet()) 

問題は、上記の定義が与えられるということですエラーmake_make_packet(Application)が呼び出された場合、Applicationはまだ定義されていません。

、いくつかのクラスのための機能を繰り返すことなく、この問題を解決するためにそこの方法ですと(とにかくここでは動作しません)self.headerを使用せずに

注:make_packet()が呼び出される必要があります(OSIの7層モデル)パケットは1回ではなく2回ずつ作成されます。最初にApplicationは、生データをパケットにラップし、パケットをさらに大きなパケットでTCPでそれ自身のヘッダーを追加してさらにラップします。

+0

「パケット」メソッドに継承を使用できない理由はわかりません。 –

+0

@DanielRoseman私はあなたを取得していない、あなたは精巧さを教えてくださいできますか? 'packet'はメソッドではなく、インスタンス変数です。 – forumulator

答えて

0

クラス属性には、self.もアクセスできます。

class Application: 
    header = footer = "001101" 

    def __init__(self, data): 
     self.packet = data 

    def make_packet(self): 
     self.packet = self.header + self.packet + self.footer 
     checksum = self.packet[::-1] 
     self.packet += checksum 
     return self.packet 


class TCP(Application): 
    header = footer = "110011" 

    def __init__(self, data): 
     data = Application(data).make_packet() 
     super().__init__(data) 
+0

'TCP .__ init__'に' self.make_packet() 'を使ってください。 –

関連する問題