簡體   English   中英

在Python中為類屬性創建“標准屬性”

[英]Create a 'standard property' for class attributes in Python

我有一個類,用於將二進制流轉換為人類可讀的。 我想以兩種方式翻譯它,因為我發送和接收二進制消息。 這個類的屬性大多以相同的方式 - 從startbyte到stopbyte的字節並解碼它們 - 所以我決定使用一個屬性來做到這一點。 但是,我可以創建一個在定義類屬性時使用的一般“屬性”嗎?

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)

我試圖定義一個函數,它接受兩個參數並返回屬性(getter,setter),但總是我堅持給函數提供“self”實例。 有沒有一個很好的方法我可以做到這一點?

讓您的函數生成getter和setter,並返回這兩個函數的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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM