使用python中的类方法修改对象的属性

时间:2019-04-10 21:35:42

标签: python

我试图使用在类中定义的方法来稍后修改由该类制成的对象的属性,但是似乎存在一个范围问题,这对我来说并不明显。输入以下代码:

class Test:
    def __init__(self, attribute):
        self.attribute = attribute
    def change_attrib(self, attribute, value):
        if attribute + value < 0: attribute = 0
        else: 
            attribute += value
            print(str(attribute) + ' This is inside the method')

test1 = Test(10)

print(str(test1.attribute) + " This is before running the method")

test1.change_attrib(test1.attribute, 10)

print(str(test1.attribute) + " This is after running the method")

test1.attribute += 20

print(str(test1.attribute) + " This is after modifying the attribute directly")

运行此代码将产生以下结果:

10 This is before running the method
20 This is inside the method
10 This is after running the method
30 This is after modifying the attribute directly

因此,即使我在调用该方法时显式引用了要更改的实例,该方法中发生的所有事情仍然保留在该方法中。

我可以看到直接修改属性是可行的,但是我想防止出现负值(因此该方法)。我也知道我可以在方法中使用内置的setattr()函数,并且效果很好,但是要求在将属性传递给方法之前,我将属性的语法更改为字符串,并且我更喜欢显式引用属性。最后,我真的很想了解这里发生的事情。

编辑: 这是工作代码,基于rdvdev2的提示。我只需要引用self即可设置实例的值:

class Test:
def __init__(self, attribute):
    self.attribute = attribute
def change_attrib(self, attribute, value):
    if attribute + value < 0: attribute = 0
    else: 
        attribute += value
        self.attribute = attribute
        print(str(attribute) + ' This is inside the method')

还要感谢kindall对发生的事情的出色解释。

最后一个扩展:上面的代码实际上仅在属性命名为attribute时才有效。我认为kindall可以更好地掌握我在这里需要的东西。为了使该函数用于修改对象的任何属性,我需要某种方式来引用所需的属性。由于python似乎传递的是值而不是引用,因此我必须以某种方式获取引用,而对现有代码影响最小的方法似乎是使用get / setattr ....所以我破解了regex并更改了160+参考。

2 个答案:

答案 0 :(得分:1)

当您将test1.attribute传递到change_attrib()时,方法内的attribute的值不是指向test1.attribute的指针,该指针可用于更改其值。它是整数10。然后将参数value添加到attribute,得到等于20的attribute。然后该方法结束,attribute的值消失了。 test1.attribute的值从未更改,因为您从未更改过。

如果希望方法修改任何属性,则可以将其名称作为字符串传递。然后,您可以使用getattr()setattr()来获取和设置属性。

def change_attrib(self, name, value):
        attribute = getattr(self, name)
        if attribute + value < 0: attribute = 0
        else: 
            attribute += value
            print(str(attribute) + ' This is inside the method')
        setattr(self, name, attribute)

test1.change_attrib("attribute", 10)

答案 1 :(得分:0)

在类方法中,您正在修改attribute变量,其中wich是一个函数参数。如果要修改对象属性,则必须访问self.attribute