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