代码之家  ›  专栏  ›  技术社区  ›  Matina G

自动跟踪属性值

  •  0
  • Matina G  · 技术社区  · 6 年前

    假设我有一个类定义为:

    class Wall(object):
        def __init__(self, color):
            self.color = color
    

    我想自动跟踪颜色转换。 也就是说,如果我将我的班级声明如下:

    wall = Wall('red')
    

    然后改变颜色:

    wall.color = 'green'
    

    我想自动得到一个名单

    ['green', 'red']
    

    以这样的方式创建,如果我继续:

    wall.color = ['yellow']
    

    我得到清单:

    ['yellow', 'green']
    

    等等。

    到目前为止我所做的尝试都不起作用:

    class Wall(object):
    
    def __init__(self, color):
        self.color = color
        self._last_two_colors = [self.color, None]
    
    def change_color(self, color):
        self._last_two_colors[1] = self._last_two_colors[0]
        self._last_two_colors[0] = self.color
        return self._last_two_colors
    

    我的初始版本,不工作,很遗憾:

    class Wall(object):
    
        def __init__(self, color):
            self._last_two_colors = []
            self.color = color
    
        @property
        def last_two_colors(self):
            return self._last_two_colors
    
        @last_two_colors.setter
        def last_two_colors(self):
            self._last_two_colors = [self.color]+self._last_two_colors
            self._last_two_colors = self._last_two_colors[:2]
            return self._last_two_colors
    

    应该注意的是,我不希望调用方法change_color,它必须在更新颜色时自动调用。 有什么主意吗? 事先谢谢。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Michael H.    6 年前

    In [14]: class Wall(object):
    ...: 
    ...:     def __init__(self, color):
    ...:         self.__last_two = [color, color]
    ...:         self.__color = color
    ...:     
    ...:     @property
    ...:     def color(self):
    ...:         return self.__color
    ...:     
    ...:     @color.setter
    ...:     def color(self, new_val):
    ...:         self.__color = new_val
    ...:         self.__last_two.pop(0)
    ...:         self.__last_two.append(new_val)
    ...:         print(self.__last_two)
    ...:  
    
    In [15]: x = Wall(1)
    
    In [16]: x.color
    Out[16]: 1
    
    In [17]: x.color = 2
    [1, 2]
    
    In [18]: x.color = 3
    [2, 3]
    
    In [19]: x.color = 4
    [3, 4]
    
        2
  •  0
  •   aldokkani    6 年前

    property()

    class Wall(object):
    
        def __init__(self, color):
            self._color = color
            self._color_transitions = [color]
    
        @property
        def color(self):
            """I'm the 'color' property."""
            return self._color
    
        @color.setter
        def color(self, value):
            if len(self._color_transitions) > 1:
                self._color_transitions.pop(0)
            self._color_transitions.append(value)
            self._color = value
    
        @property
        def color_transitions:
            return self._color_transitions