【问题标题】:Create a 'standard property' for class attributes in Python在 Python 中为类属性创建“标准属性”
【发布时间】:2016-08-01 12:10:34
【问题描述】:

我有一个类,用于将二进制流转换为人类可读的。我想双向翻译它,因为我发送和接收二进制消息。这个类的属性大多以相同的方式制作——将字节从 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”实例。有什么好的方法可以实现吗?

【问题讨论】:

    标签: python properties


    【解决方案1】:

    让您的函数同时生成 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'
    

    【讨论】:

    • 很棒,这正是我所需要的。我知道我可以把它放在课外,但现在对我来说毫无意义。
    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 2018-08-07
    • 1970-01-01
    相关资源
    最近更新 更多