Python:从类属性中减去的递归方法?

时间:2011-03-17 00:41:17

标签: python recursion

我有一个有很多属性的类,当我给出一个数字时,我希望它从一个属性中减去它,但是如果数量大于从中减去的属性,则移动到剩下的属性的下一个属性过度。例如:

def subt(self, amount):
    self.attr1 += amount
    if self.attr1 < 0:
        self.attr2 += self.attr1
        self.attr1 = 0
        if self.attr2 < 0:
            # etc...

感觉应该有一种简洁的递归方式来完成同样的事情,但我不知道如何使用所有不同的属性。

3 个答案:

答案 0 :(得分:4)

您可以使用.__dict__访问属性您需要一个要减去的订单列表。像这样的东西。

class A():
    def __init__(self):
        self.foo = 100
        self.bar = 200
        self.baz = 300
        self.sub_stack = ['foo', 'baz', 'bar']

    def subt(self, amount):
        tmp_stack = self.sub_stack[:]
        while tmp_stack and amount:
            key = tmp_stack.pop(0)
            val = self.__dict__[key]
            if val > amount:
                self.__dict__[key] -= amount
                amount = 0
            else:
                amount -= self.__dict__[key]
                self.__dict__[key]=0
        return amount 

返回值是在遍历属性

之后的余额

答案 1 :(得分:0)

从所有属性中制作列表是否有效?

def subt(self, amount): 
    i = 0
    while i<self.attrlist.len:
        if attrlist[i] < amount:
            attrlist[i] -= amount
            break

答案 2 :(得分:0)

是的,最好的方法是创建所有属性的列表 - 手动执行, 或者,如果您的属性名称遵循模式(如示例中的attrN系列), 您可以自动创建这样的列表。

def subt(self, amount):
    #all_attrs = ["attr1", "attr2", "attr3"]
    # or this step can be automated by something like:
    all_attrs = sorted(attr_name for attr_name in self.__class__.__dict__.keys() if attr_name.startswith("attr"))
    for i, attr_name in all_attrs:
        self.__setattr__(getattr(self, attr_name) + amount)
        if gettattr(self, attr_name) < 0:
            amount = gettattr(self, attr_name)
            self.__setattr__(self, attr_name, 0)
        else: 
            break