Python中的嵌套/内部只读属性

2024-10-02 20:39:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望获得这样的行为,即我可以访问类Room中指定的内部属性max

>>> r = Room()
>>> r.temperature
22.0
>>> r.temperature = 18.0
>>> r.temperature.max
30.0
>>> r.temperature
18.0

我想用这个最小的代码来实现这个行为:

class Room(object):    
    @inner_property('min', get_temperature_min)
    @inner_property('max', get_temperature_max)
    def temperature(self):
        '''The temperature of the room'''
        return get_temperature()

但目前,我只能使用以下代码成功实现此行为:

class Room(object):
    __init_done = False

    def __init__(self):
        self.temperature = "shadow"
        self.__init_done = True

    def __getattribute__(self, attr):
        if attr is 'temperature':
            return FloatMinMax(get_temperature(),                 
                get_temperature_min(), get_temperature_max(),
                'Room temperature')
        return super(Room, self).__getattribute__(attr)

    def __setattr__(self, attr, value):
        if attr is not 'temperature' or self.__init_done is False:
            super(Room, self).__setattr__(attr, value)
        else:
            set_temperature(value)

class FloatMinMax(float):
    def __new__(cls, value, min_, max_, doc_):
        return super(FloatMinMax, cls).__new__(cls, value) 

    def __init__(self, value, min_, max_, doc_):
        self.__min = min_
        self.__max = max_
        self.__doc__ = doc_
        super(FloatMinMax, self).__init__()

    @property
    def min(self): return self.__min

    @property
    def max(self): return self.__max

如何使用decorator简化编写


Tags: selfgetdocreturninitvaluedefproperty