2016-08-01 5 views
1

私は、バイナリストリームを人間が読めるように変換するためのクラスを持っています。私はバイナリメッセージを送受信するので、両方向に翻訳したいと思います。このクラスの属性は、ほとんど同じ方法で作成されます。つまり、startbyteからstopbyteにバイトを取り込んでデコードします。そのためにプロパティを使用することにしました。しかし、クラス属性を定義するときに使用される一般的な "プロパティ"を作ることはできますか?Pythonでクラス属性の '標準プロパティ'を作成します。

class Packet(object): 
    def __init__(self, data): 
     self.data = data 

    def standard_getter(startbyte, stopbyte): 
     def getter(self): 
      return decode(self.data[startbyte:stopbyte]) 
     return getter 

    def standard_setter(startbyte, stopbyte): 
     def setter(self, value): 
      self.data[startbyte:stopbyte] = encode(value) 
    return setter 

    # the way I define properties by now: 
    protocol_type = property(standard_getter(16, 18), standard_setter(16, 18)) 
    protocol_sub_type = property(standard_getter(18, 20), standard_setter(18, 20)) 

    # the way I would like to do it: 
    protocol_type = property(standard_property(16, 18)) 
    # or 
    protocol_type = standard_property(16, 18) 

私は2つの引数を取り、プロパティ(ゲッター、セッター)を返す関数を定義しようとしたが、いつも私は関数に「自己」のインスタンスを与えることにこだわっています。私はそれを作る良い方法はありますか?

答えて

3

は、あなたの関数がゲッターとセッターの両方を生産し、これら二つの機能のためにpropertyオブジェクトを返す持っている:

def standard_property(startbyte, stopbyte): 
    def getter(self): 
     return decode(self.data[startbyte:stopbyte]) 
    def setter(self, value): 
     self.data[startbyte:stopbyte] = encode(value) 
    return property(getter, setter) 

その後直接戻り値を使用します。

protocol_type = standard_property(16, 18) 
protocol_sub_type = standard_property(18, 20) 

注意をstandard_property()機能することをあなたのクラスに住んでいる必要はありません。

>>> def standard_property(startbyte, stopbyte): 
...  def getter(self): 
...   return decode(self.data[startbyte:stopbyte]) 
...  def setter(self, value): 
...   self.data[startbyte:stopbyte] = encode(value) 
...  return property(getter, setter) 
... 
>>> encode = lambda v: list(v) 
>>> decode = lambda v: ''.join(v) 
>>> class Packet(object): 
...  def __init__(self, data): 
...   self.data = data 
...  protocol_type = standard_property(16, 18) 
...  protocol_sub_type = standard_property(18, 20) 
... 
>>> p = Packet(list('foo bar baz spam ham eggs')) 
>>> p.protocol_type 
' h' 
>>> p.protocol_sub_type 
'am' 
>>> p.protocol_type = '_c' 
>>> p.protocol_sub_type = 'an' 
>>> ''.join(p.data) 
'foo bar baz spam_can eggs' 
+0

偉大なもの、それは私が必要なものです。私はクラスの外に置くことができますが、今は私にとっては意味がありません。 – Grysik

関連する問題