我有一个类,用于将二进制流转换为人类可读的。我想以两种方式翻译它,因为我发送和接收二进制消息。这个类的属性大多以相同的方式 - 从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”实例。我能做出很好的方式吗?
答案 0 :(得分:3)
让你的函数生成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'