我有一个有很多属性的类,当我给出一个数字时,我希望它从一个属性中减去它,但是如果数量大于从中减去的属性,则移动到剩下的属性的下一个属性过度。例如:
def subt(self, amount):
self.attr1 += amount
if self.attr1 < 0:
self.attr2 += self.attr1
self.attr1 = 0
if self.attr2 < 0:
# etc...
感觉应该有一种简洁的递归方式来完成同样的事情,但我不知道如何使用所有不同的属性。
答案 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