如何使用减少每个单独元素的多重设置/取消设置功能
how to use reduce the multiple set / unset function of each indivdual elemnt
考虑到我将有多个值要分配和取消分配,我怎样才能使这段代码更紧凑
class A:
def __init__(self,*args,**kwargs):
self._a = 0
self._b =0
def set_a(self):
self._a = 1
def set_b(self):
self._b = 1
def unset_a(self):
self._a =0
def unset_b(self):
self._b = 0
x=A()
x.set_a()
print(x._a) # 1
x.unset_a()
print(x._a) # 0
我只是想避免编写多个 set 和 unset 函数,只是一个简单的 1 函数,我将类型 (set/unset) 和目标变量传递给目标,这样就可以了
我很想做类似下面的事情,使用字典而不是多个变量:
class A:
def __init__(self,*args,**kwargs):
self._d = {'_a': 0, '_b': 0}
def set_d_item(self, key, val):
self._d[key] = val
x=A()
x.set_d_item('_a', 1)
print(x._d['_a']) # 1
x.set_d_item('_a', 0)
print(x._d['_a']) # 0
如果您真的需要示例中的属性,您可以使用 exec()
,但我真的不建议允许任意代码执行:
class A:
def __init__(self,*args,**kwargs):
self._a = 0
self._b =0
def set_item(self, key, val):
exec(f'self.{key} = {val}')
x=A()
x.set_item('_a', 1)
print(x._a) # 1
x.set_item('_a', 0)
print(x._a) # 0
您可以使用基于预定义配置的 setattr 使其更紧凑
class A:
_a = 0
_b = 0
var_config = {
'_a': {'unset': 0, 'set': 1},
'_b': {'unset': 0, 'set': 1},
}
def set_var(self, var, action='set'):
setattr(self, var, self.var_config[var][action])
>>> x = A()
>>> print(x._a)
0
>>> x.set_var('_a')
>>> print(x._a)
1
>>> x.set_var('_a', action='unset')
>>> print(x._a)
0
考虑到我将有多个值要分配和取消分配,我怎样才能使这段代码更紧凑
class A:
def __init__(self,*args,**kwargs):
self._a = 0
self._b =0
def set_a(self):
self._a = 1
def set_b(self):
self._b = 1
def unset_a(self):
self._a =0
def unset_b(self):
self._b = 0
x=A()
x.set_a()
print(x._a) # 1
x.unset_a()
print(x._a) # 0
我只是想避免编写多个 set 和 unset 函数,只是一个简单的 1 函数,我将类型 (set/unset) 和目标变量传递给目标,这样就可以了
我很想做类似下面的事情,使用字典而不是多个变量:
class A:
def __init__(self,*args,**kwargs):
self._d = {'_a': 0, '_b': 0}
def set_d_item(self, key, val):
self._d[key] = val
x=A()
x.set_d_item('_a', 1)
print(x._d['_a']) # 1
x.set_d_item('_a', 0)
print(x._d['_a']) # 0
如果您真的需要示例中的属性,您可以使用 exec()
,但我真的不建议允许任意代码执行:
class A:
def __init__(self,*args,**kwargs):
self._a = 0
self._b =0
def set_item(self, key, val):
exec(f'self.{key} = {val}')
x=A()
x.set_item('_a', 1)
print(x._a) # 1
x.set_item('_a', 0)
print(x._a) # 0
您可以使用基于预定义配置的 setattr 使其更紧凑
class A:
_a = 0
_b = 0
var_config = {
'_a': {'unset': 0, 'set': 1},
'_b': {'unset': 0, 'set': 1},
}
def set_var(self, var, action='set'):
setattr(self, var, self.var_config[var][action])
>>> x = A()
>>> print(x._a)
0
>>> x.set_var('_a')
>>> print(x._a)
1
>>> x.set_var('_a', action='unset')
>>> print(x._a)
0