Python 对象状态跟踪成语
Python object state tracking idiom
我有一个充当远程系统接口的对象,我需要跟踪各种状态。哪种方法更好或更符合 Python 风格?如果状态列表真的很长或很复杂,一种方法会更好吗?
一个。具有对象属性:
class Session (object):
def__init__(self):
self.a_set = False
self.b_set = False
def set_a(self):
self.a_set = True
乙。用代表状态的字典:
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
我可能会得到一堆需要跟踪其他状态的子 类,但仍会立即将它们全部重置。
我只是想确保我没有搬起石头砸自己的脚,或者做任何真正的事情 weird/anti-pattern。
从用户的角度来看,应该是第一个选项;我们应该可以使用:
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 风格?如果状态列表真的很长或很复杂,一种方法会更好吗?
一个。具有对象属性:
class Session (object):
def__init__(self):
self.a_set = False
self.b_set = False
def set_a(self):
self.a_set = True
乙。用代表状态的字典:
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
我可能会得到一堆需要跟踪其他状态的子 类,但仍会立即将它们全部重置。 我只是想确保我没有搬起石头砸自己的脚,或者做任何真正的事情 weird/anti-pattern。
从用户的角度来看,应该是第一个选项;我们应该可以使用:
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)