Python对象状态跟踪习语

时间:2015-08-31 20:38:18

标签: python object state idioms

我有一个对象充当远程系统的接口,我需要跟踪各种状态。这样做的更好或更pythonic的方法是什么?如果状态列表真的很长或很复杂,那么一种方式会更好吗?

一个。对象属性:

class Session (object):
    def__init__(self):
        self.a_set = False
        self.b_set = False

    def set_a(self):
        self.a_set = True

B中。用一个代表国家的字典:

    class Session (object):
    def__init__(self):
        self.state = {}

    def set_a(self):
        self.state['a_set'] = True

其他详情:

我最初设置了状态字典,以便我可以快速重置:

def reset_state(self):
    for k in self.state:
        self.state[k] = False

我最终会得到一堆需要跟踪其他状态的子类,但仍然会立即重置它们。 我只是想确保我不会在脚下拍摄自己,或做任何非常奇怪/反模式的事情。

1 个答案:

答案 0 :(得分:1)

从用户的角度来看,它应该看起来像第一个选项;我们应该可以使用:

if session.a_set:
    do_something()

有几种不同的方法可以实现:

# simple method
class Session(object):
    def __init__(self):
        self.a_set = False
        self.b_set = False
    def reset(self):
        self.b_set = False

但是,如果你有超过几手满满的变量,这很快就会成为维护的噩梦。

我建议class decorator方法,有几个帮手:

# not strictly necessary
class Persist(object):
    """
    Do not clear this variable with reset().
    """
    def __init__(self, val):
        self.val = val

# necessary
class Reset(object):
    """
    Clear this variable with reset().
    """
    def __init__(self, val):
        self.val = val

def BuildResets(cls):
    reset = cls.resetable = []
    persist = cls.persistent = []
    for name, obj in cls.__dict__.items():
        if isinstance(obj, Reset):
            setattr(cls, name, obj.value)
            reset.append(name)
        elif isinstance(obj, Persist):
            setattr(cls, name, obj.value)
            persist.append(name)
    return cls

并在使用中:

@BuildResets
class Session(object):
    self.a_set = Persist(False)
    self.b_set = Reset(False)
    def reset(self):
        for name in self.resetable:
            setattr(self, name, False)
相关问题