gpt4 book ai didi

python - 在Python中为类属性创建 'standard property'

转载 作者:行者123 更新时间:2023-11-30 22:52:13 26 4
gpt4 key购买 nike

我有一个类,用于将二进制流转换为人类可读的。我想以两种方式翻译它,因为我发送和接收二进制消息。此类的属性大多以相同的方式创建 - 获取从起始字节到停止字节的字节并对其进行解码 - 因此我决定使用属性来做到这一点。但是我可以创建一个在定义类属性时使用的通用“属性”吗?

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'

关于python - 在Python中为类属性创建 'standard property',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38698535/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com