2016-08-01 10 views
1

Ich habe eine Klasse, die verwendet wird, um Binär-Stream in Menschen lesbar zu übersetzen. Ich möchte es in beide Richtungen übersetzen, weil ich binäre Nachrichten sende und empfange. Attribute dieser Klasse werden größtenteils auf die gleiche Weise erstellt - nehmen Sie die Bytes von Startbyte zu Stopbyte und dekodieren Sie sie - also habe ich eine Entscheidung getroffen, eine Eigenschaft dafür zu verwenden. Kann ich aber eine allgemeine "Eigenschaft" angeben, die bei der Definition meiner Klassenattribute verwendet wird?Erstellen Sie eine 'Standard-Eigenschaft' für Klassenattribute in 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) 

Ich habe versucht, eine Funktion zu definieren, die zwei Argumente und gibt Eigenschaft (Getter, Setter) Ich bin, aber immer fest im Geben „Selbst“ Instanz an die Funktion übernimmt. Gibt es einen schönen Weg, wie ich es schaffen kann?

Antwort

3

Haben Sie Ihre Funktion produzieren sowohl die Getter und Setter, und senden Sie das property Objekt für diese beiden Funktionen:

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) 

dann direkt den Rückgabewert verwenden:

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

Beachten Sie, dass die standard_property() Funktion muss nicht einmal in deiner Klasse leben; es könnte auch eine Top-Level-Funktion sein:

>>> 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

Große, das ist, was ich brauchte. Ich weiß, dass ich es außerhalb der Klasse ausdrücken kann, aber inzwischen macht es keinen Sinn für mich. – Grysik

Verwandte Themen