Python 对象状态跟踪惯用语

标签 python object state idioms

我有一个充当远程系统接口(interface)的对象,我需要跟踪各种状态。哪种方法更好或更符合 Python 风格?如果状态列表真的很长或很复杂,一种方法会更好吗?

一个。具有对象属性:

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

我最终可能会得到一堆需要跟踪其他状态的子类,但仍会同时重置它们。 我只是想确保我没有搬起石头砸自己的脚,或者做任何非常奇怪/反模式的事情。

最佳答案

从用户的角度来看,应该是第一个选项;我们应该能够使用:

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)

关于Python 对象状态跟踪惯用语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32319597/

相关文章:

javascript - react ,将状态从子组件传递到父组件

Python 重新编译。不平衡的括号错误

python - 如何将 utf-8 字符从 python 保存到 mySQL

java - 虚拟机或编译器如何诊断Java中具有相同变量名的两个对象?

javascript - 在 html <object> 中嵌入 dll

android - 如何让Android程序中的所有 Activity 都可以访问一个对象?

javascript - 如何在 react 中将状态提升两个级别?

android - 如何覆盖 Sherlock 操作栏中的按下状态颜色?

python - 使用 docker-compose 在 docker 中运行任何 manage.py 命令时没有名为 django 的模块错误

python - 将 csv 上传到大查询时添加日期加载字段