如何使用减少每个单独元素的多重设置/取消设置功能

Posted

技术标签:

【中文标题】如何使用减少每个单独元素的多重设置/取消设置功能【英文标题】:how to use reduce the multiple set / unset function of each indivdual elemnt 【发布时间】:2020-03-29 03:45:32 【问题描述】:

考虑到我将要分配和取消分配多个值,我如何使这段代码更紧凑

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

我只是想避免编写多个设置和取消设置函数,只是一个简单的 1 函数,我将类型(设置/取消设置)和哪个变量传递给目标,就可以了

【问题讨论】:

【参考方案1】:

您可以根据预定义的配置使用 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

【讨论】:

【参考方案2】:

我很想使用字典而不是多个变量来执行以下操作:

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

【讨论】:

我也尝试过这种方式,这与我的其他模块冲突,我必须定义值,因为它们不在字典中,也许是我在这里寻找的一些装饰器 我使用exec()添加了第二个选项。 exec 是个好方法,但执行这个并将其留在我的本地人并不是我所需要的 我不确定你的意思 - 使用 exec 会像你最初的例子一样工作。 绝对 - 这就是我说我不推荐它的原因。

以上是关于如何使用减少每个单独元素的多重设置/取消设置功能的主要内容,如果未能解决你的问题,请参考以下文章

youku总结

如何使用 javascript 或 jquery 为每个数组元素设置背景颜色和边框?

如何使用 jQuery 取消设置元素的 CSS 属性?

PIE SDK元素的选择和取消选择

redis02

如何为每个 WebGL 三角形设置单独的颜色?