Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建一个';标准属性';用于Python中的类属性_Python_Properties - Fatal编程技术网

创建一个';标准属性';用于Python中的类属性

创建一个';标准属性';用于Python中的类属性,python,properties,Python,Properties,我有一个类,用于将二进制流转换为人类可读的。我想双向翻译,因为我发送和接收二进制消息。这个类的属性的生成方式基本相同——将字节从startbyte转换为stopbyte并对其进行解码——因此我决定使用一个属性来实现这一点。但是,我可以创建一个在定义类属性时使用的通用“属性”吗 class Packet(object): def __init__(self, data): self.data = data def standard_getter(startbyte

我有一个类,用于将二进制流转换为人类可读的。我想双向翻译,因为我发送和接收二进制消息。这个类的属性的生成方式基本相同——将字节从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,并为这两个函数返回
属性
对象:

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'

很好,这就是我需要的。我知道我可以把它放在课外,但现在它对我来说毫无意义。