2016-03-22 24 views
1

我正在实现一个具有大量变量的类。在那个类中,我想要做一个get函数和一个set函数,这些函数将有4个(在这个例子中是2个)参数。 例如:合并获取和设置函数python

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的,别的部分,我无法找到一个方法来导出到一个功能。什么是美丽的Python方法来做到这一点?

+0

让我猜测:所有这些变量可以是'0'或'1'?你是否试图阻止某种位域? – L3viathan

+3

这味道像一个XY问题。 – ubadub

+0

@ L3viathan nope,它们的范围可以从0到16 – TJR

回答

0

为什么不能像下面这样:

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" 

不知道如果你被其他条件的限制,但你肯定可以简化这一过程通过使所有var参数成为列表或数组中的值并基于arg1arg2值对其进行索引。你可以创建一个索引numpy的阵列,如:

self.index = numpy.array([[0,1],[2,3]]) 

则变量数组会

self.var = np.array([0,0,0,0]) 

现在你的方法并不需要所有这些如果/ elifs

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]] 
0

不知道我完全掌握它;如果你问如何合并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] 

不过,我可能宁愿尝试类似:

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] 
1

正如ubadub说,好像you're not actually telling us what you want to achieve

如果我的猜测,你想节省位的领域是正确的,就可以使整个事情很简单:

def get(self, arg1, arg2): 
    return getattr(self, "var" + str(1+2*(1-arg2)+(1-arg1))) 

但在这种情况下,有much better ways

+1

我们不鼓励人们在不需要时进行字符串评估吗?这听起来像一个可怕的代码混乱继承。我接受你的答案是短暂的,并且重要,并且会起作用,直到他们决定改变变量名称,这是应该**从不**破坏程序运行的东西...... – dwanderson

+0

@dwanderson我只是想提出一个观点。 – L3viathan

+2

有人在没有大量Python背景的情况下可以看到你的答案,看到它“非常简单”,然后开始实施类似的东西。我之前继承了这样的代码库,这让我不得不考虑它。如果一个孩子要求拿枪,我不会说“你可能意思是一把水枪,但这是一个9毫米,使用起来非常简单” – dwanderson

1

例如,使用一个数组变量,并从您的参数计算索引:

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 
+1

当我们不需要时,我们是否可以鼓励人们进行字符串评估?这听起来像一个可怕的代码混乱继承。我接受你的答案很简短,并且直到他们决定改变变量名为止,这是应该**从不破坏程序运行的东西...... – dwanderson

+0

你是对的。我相应地改变了它! – schwobaseggl