在python中合并get和set函数
我正在实现一个包含大量变量的类。在那个类中,我想做一个get函数和一个set函数,这些函数将有4个(本例中为2个)参数。 例如:在python中合并get和set函数,python,Python,我正在实现一个包含大量变量的类。在那个类中,我想做一个get函数和一个set函数,这些函数将有4个(本例中为2个)参数。 例如: class MyClass(object): def __init__(self): self.var1 = 0 self.var2 = 0 self.var3 = 0 self.var4 = 0 def get(self, arg1, arg2): if arg1 an
class MyClass(object):
def __init__(self):
self.var1 = 0
self.var2 = 0
self.var3 = 0
self.var4 = 0
def get(self, arg1, arg2):
if arg1 and arg2:
return self.var1
elif not arg1 and arg2:
return self.var2
elif arg1 and not arg2:
return self.var3
else:
return self.var4
def set(self, arg1, arg2, value):
if arg1 and arg2:
self.var1 = value
elif not arg1 and arg2:
self.var2 = value
elif arg1 and not arg2:
self.var3 = value
else:
self.var4 = value
正如您所看到的,我的问题是,如果elif else是一部分,则无法找到导出到一个函数的方法。python最漂亮的方法是什么?为什么不采用以下方式:
class MyClass(object):
def __init__(self):
self.var1 = 0
self.var2 = 0
self.var3 = 0
self.var4 = 0
def view(self, arg1, arg2, value = None):
if arg1 and arg2:
if value is not None: self.var1 = value
return self.var1
elif not arg1 and arg2:
if value is not None: self.var2 = value
return self.var2
elif arg1 and not arg2:
if value is not None: self.var3 = value
return self.var3
else:
if value is not None: self.var4 = value
return self.var4
然后你就有了这样的东西:
myclass = MyClass()
myclass.view(0,1,1) # Changes the value, returns to nothing
x = myclass.view(0,1) # Doesn't change value, returns to "x"
class Something(object):
def __init__(self, var1, var2, var3, var4):
self.var1 = var1
self.var2 = var2
self.var3 = var3
self.var4 = var4
self.values = [var1, var2, var3, var4]
def get(self, arg1, arg2):
""" Either require, or manually convert, arg1, arg2 into 0, 1"""
index = arg2 << 1 | arg1
return self.values[index]
不确定您是否受到其他条件的约束,但您当然可以通过将所有var
参数设置为列表或数组中的值,并基于arg1
和arg2
值对其进行索引来简化此过程。您可以创建索引numpy数组,如:
self.index = numpy.array([[0,1],[2,3]])
那么您可以使用变量数组
self.var = np.array([0,0,0,0])
现在,您的方法不需要所有这些if/elif
def view(self, arg1, arg2, value = None)
if value is not None: self.var[self.index[arg1,arg2]] = value
return self.var[self.index[arg1,arg2]]
我不确定我是否完全理解它;如果您询问如何将get函数与set函数合并,我认为这没有意义(如公式所示)在实例上设置值,或者获取已经设置的值
class Something(object):
def __init__(self, var1, var2, var3, var4):
self.var1 = var1
self.var2 = var2
self.var3 = var3
self.var4 = var4
def getValue(self, chooseOdd, chooseFirst):
if chooseOdd:
choices = [self.var1, self.var3]
else:
choices = [self.var2, self.var4]
index = 0 if chooseFirst else 1
return choices[index]
但我更愿意尝试这样的方式:
myclass = MyClass()
myclass.view(0,1,1) # Changes the value, returns to nothing
x = myclass.view(0,1) # Doesn't change value, returns to "x"
class Something(object):
def __init__(self, var1, var2, var3, var4):
self.var1 = var1
self.var2 = var2
self.var3 = var3
self.var4 = var4
self.values = [var1, var2, var3, var4]
def get(self, arg1, arg2):
""" Either require, or manually convert, arg1, arg2 into 0, 1"""
index = arg2 << 1 | arg1
return self.values[index]
class某物(对象):
定义初始化(self,var1,var2,var3,var4):
self.var1=var1
self.var2=var2
self.var3=var3
self.var4=var4
self.values=[var1,var2,var3,var4]
def get(自身、arg1、arg2):
“”“需要或手动将arg1、arg2转换为0、1”“”
index=arg2正如ubadub所说,似乎是这样的
如果我猜您试图保存一个位字段是正确的,那么您可以使整个过程非常简单:
def get(self, arg1, arg2):
return getattr(self, "var" + str(1+2*(1-arg2)+(1-arg1)))
但在这种情况下,有。例如,使用数组变量并根据参数计算索引:
class MyClass(object):
def __init__(self):
self.var = 4 * [0]
def index(self, arg1, arg2):
return 2*int(bool(arg1)) + int(bool(arg2)) # possible results: 0, 1, 2, 3
def get(self, arg1, arg2):
return self.var[self.index(arg1, arg2)]
def set(self, arg1, arg2, value):
self.var[self.index(arg1, arg2)] = value
让我猜猜:所有这些变量可以是0
或1
?你是在试图弹劾某种位字段吗?这闻起来像是XY问题。@L3via不,它们的范围可以是0到16@TJR无论如何,请使用getattr和setattr。这是“蟒蛇式”的方式。Python有非常强大的内省功能,所以我们能不能鼓励人们在不需要的时候进行字符串求值呢?这听起来像是一个可怕的代码混乱的继承。我承认你的答案很简短,很中肯,在他们决定更改变量名之前,这是一个永远不会中断程序运行的东西……没有大量Python背景的人可以看到你的答案,看到它“非常简单”,然后开始实现类似的东西。我以前也继承过这样的代码库,一想到它我就感到畏缩。如果一个孩子要一支枪,我不会说“你可能是指一支水枪,但这里有一支9毫米的,使用起来很简单”我们能不能不鼓励人们在不需要的时候进行弦评估?这听起来像是一个可怕的代码混乱的继承。我承认你的答案很简短,很中肯,在他们决定更改变量名之前,这是一个永远不会中断程序运行的问题。。。