我正在尝试根据传入的内容更改类的状态,但是我无法弄清楚如何将实例变量作为参数传入并进行修改
class Foo:
a = 5
b = 6
def addnum(self, instancevar):
"""
depending on what I pass in the variable in the instance is incremented
"""
instancevar +=1
return instancevar
bar = Foo()
bar.addnum(bar.a) #expecting a = 6
bar.addnum(bar.b) #expecting b = 7
这给了我我想要的东西,但是感觉像我在用错误的原因使用kwargs
class Foo:
a = 5
b = 6
def add_num(self, **kwargs):
if 'a' in kwargs:
self.a += 1
if 'b' in kwargs:
self.b += 1
bar = Foo()
print(bar.a) # a= 5
bar.add_num(a='whateverIWant')
print(bar.a) # a= 6
有更好的方法吗?谢谢
答案 0 :(得分:0)
实例变量与普通变量类似,不同之处在于您需要在实例变量前加上实例instance.attribute
。
您可以正常使用它们,并像正常变量一样对它们执行操作。无需创建函数即可执行此操作:
bar = Foo()
print(bar.a) # --> 5
bar.a += 1
# add 1 to the bar.a attribute
print(bar.a) # --> 6
在您的示例中,您将bar.a
和bar.b
都加了1。如果您想深入研究OOP,则可以尝试操作符重载。这意味着使用定义特殊方法(例如__add__
和__len__
)来实现自定义行为,并使对象的行为更像内置类型,例如int
。
class Foo()
def __init__(self, a=5, b=6):
self.a = a
self.b = b
def __add__(self, other):
if isinstance(other, (float, int)):
return Foo(self.a + other,
self.b + other)
elif isinstance(other, Foo):
return Foo(self.a + other.a,
self.b + other.b)
else:
raise NotImplemented
每次创建__init__
实例时,都会调用Foo
方法。 self.a
和self.b
是实例变量,每个实例都是唯一的,更改一个实例变量不会在所有实例上生效,而只会更改其值。
我执行__add__
时将调用特殊方法Foo() + other
,其中Foo()
可以是该类的任何实例。我已经检查了另一个值是否为数字,如果是,它将把它添加到a
和b
属性中。如果另一个值也是Foo
的实例,则它将把相应的2个a
值和2个b
值加在一起。此处描述的每种类型都返回一个新的Foo
实例。示例:
x = Foo(2, 7)
y = Foo(3, 3)
z = x + 5
print(z.a, z.b) # --> 7 and 12
# since it added 5 to x.a and x.b
w = x + y
print(w.a, w.b) # --> 5 and 10
# added x.a to y.a and x.b to y.b
print(x.a, x.b, y.a, y.b)
# --> 2, 7, 3, 3 (the original instances are unaffected)
答案 1 :(得分:0)
您可以传递变量的 name ,并执行类似的操作
def addnum(self, var_name):
setattr(self, var_name, getattr(self, var_name) + 1)