Python 将类指定为变量

Python 将类指定为变量,python,class,oop,instance,Python,Class,Oop,Instance,好的,我还是一个面向对象编程的初学者,但是我不确定为什么我的代码在为类指定一个等价的临时变量时会完全改变类的属性 class L1: value = 3 class L2: value = 1 class derived: value = 3523 def setValue(derived,Input): if len(Input) == 0: print 'Error, LIST HAS NO ENTRY' return 0

好的,我还是一个面向对象编程的初学者,但是我不确定为什么我的代码在为类指定一个等价的临时变量时会完全改变类的属性

class L1:
    value = 3
class L2:
    value = 1
class derived:
    value = 3523

def setValue(derived,Input):

    if len(Input) == 0:
        print 'Error, LIST HAS NO ENTRY'
        return 0
    elif len(Input) == 1:
        derived.value = 1
        return derived
    else:
        result = derived
        result.value = 0
        temp = derived
        for i in Input:
            print result.value
            temp.value = i.value
            print temp.value
            result.value = result.value | temp.value
        return result

def main():
    a = L1()
    b = L2()
    c = derived()
    x = [a,b]
    c = setValue(c,x)

main()
当我将临时变量result指定给派生类并更改result的value属性时,它完全更改了派生类的value属性。现在,变量temp的值也为0。它应该这样做吗?如何使结果的value属性为零,并且temp仍然设置为派生的value属性


换句话说,在最后,我希望c.value为4。

因此,问题似乎出现在以下代码中:

    result = derived
    result.value = 0
    temp = derived
    for i in Input:
        temp.value = i.value
        result.value = result.value + temp.value
    return result
请注意,
temp
result
derived
都指向同一个对象,您可以多次写入该对象的
值。基本上,您的当前环路与以下相同:

    derived.value = 0
    for i in Input:
        derived.value = derived.value + derived.value
    return derived
就我个人而言,我不明白为什么这个函数不仅仅是:

def setValue(derived, Input):
    if len(Input) == 0:
        print 'Error, LIST HAS NO ENTRY'
        return None
    elif len(Input) == 1:
        derived.value = 1
        return derived
    else:
        derived.value = sum(x.value for x in Input)
        return derived
甚至只是:

def setValue(derived, Input):
    derived.value = sum(x.value for x in Input)
    return derived
如果我们想把它分解成一个实际的循环,我们会:

def setValue(derived, Input):
    derived.value = 0
    for elem in Input:
        derived.value += elem.value
    return derived
如果我们这样做,那么我们可以看到下面的main将生成您的预期值4

c = setValue(derived(), [L1(), L2()])
print c.value

如果没有输入,我会喜欢
而不是
如果len(Input)==0:
@dano:我宁愿不要对他/她的代码做任何小改动。我们还可以讨论类变量和实例变量,我不这么做的原因是我想用result.value和temp.value做一些运算。很抱歉,我忘了在上面提到它,但我不相信位操作或。
derived.value=functools.reduce(operator.or_ux,(x.value代表输入中的x))有函数调用。
Ok,谢谢。我应该为functools导入什么模块?它只是导入functools吗?“为类指定一个等效的临时变量”-这并不是为原始类创建一个新的“等效”类。新变量和原始变量都引用了完全相同的类。通过任何一个变量对类的修改对另一个都是可见的。
result
上唯一不会出现在
derived
中的操作是
result=something\u new
,因为赋值是对变量本身的操作,而不是对它引用的对象的操作。这完全不是类的用途。为什么要使用类来实现这一点?这段代码的风格很难理解,也很难理解。保持简单。毕竟是Python。请