如何根据争辩修改类内的多个状态?

时间:2018-08-14 20:39:51

标签: python

我正在尝试根据传入的内容更改类的状态,但是我无法弄清楚如何将实例变量作为参数传入并进行修改

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

有更好的方法吗?谢谢

2 个答案:

答案 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.abar.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.aself.b是实例变量,每个实例都是唯一的,更改一个实例变量不会在所有实例上生效,而只会更改其值。 我执行__add__时将调用特殊方法Foo() + other,其中Foo()可以是该类的任何实例。我已经检查了另一个值是否为数字,如果是,它将把它添加到ab属性中。如果另一个值也是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)