Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中合并get和set函数_Python - Fatal编程技术网

在python中合并get和set函数

在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

我正在实现一个包含大量变量的类。在那个类中,我想做一个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 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毫米的,使用起来很简单”我们能不能不鼓励人们在不需要的时候进行弦评估?这听起来像是一个可怕的代码混乱的继承。我承认你的答案很简短,很中肯,在他们决定更改变量名之前,这是一个永远不会中断程序运行的问题。。。