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

2 投票
3 回答
683 浏览
提问于 2025-04-16 13:52

我有一个类,这个类里面有很多属性。当我给它一个数字的时候,我希望能把这个数字从某个属性上减去。如果这个数字比要减的属性值还大,就把剩下的部分继续往下减,直到所有属性都处理完。举个例子:

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

是的,最好的办法是先列出你所有的属性。你可以手动一个一个写下来,或者如果你的属性名称有规律可循(比如像例子中的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
0

把所有属性放到一个列表里,这样做有效吗?

def subt(self, amount): 
    i = 0
    while i<self.attrlist.len:
        if attrlist[i] < amount:
            attrlist[i] -= amount
            break
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 

返回的值是你在遍历属性后,剩下的金额。

撰写回答