Python:递归方式从类属性中减去?
我有一个类,这个类里面有很多属性。当我给它一个数字的时候,我希望能把这个数字从某个属性上减去。如果这个数字比要减的属性值还大,就把剩下的部分继续往下减,直到所有属性都处理完。举个例子:
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
返回的值是你在遍历属性后,剩下的金额。