我有这个代码可以存储一个人的姓名,年龄和资金。我正在尝试编写一种可以采用" age"或"资金"以及数字,并按该数字增加给定属性。
class Actor:
def __init__(self, name, age, funds):
self.name
self.age = age
self.funds = funds
def increase_age(self, increase_amount=1):
self.age = self.age + increase_amount
def increase_attrib(self, attrib, increase_amount=1):
self.attrib = self.attrib + increase_amount
a = Actor("Andrea", 32, 10000)
a.increase_age()
运行正常:调用它会将Andrea的年龄增加到33,就像预期的那样。但是,a.increase_attrib("age")
会出错,说AttributeError: 'Actor' object has no attribute 'attrib'
。 a.increase_attrib("funds")
给出了类似的结果。
如果我只说a.increase_attrib(age)
(没有引号),我会得到一个NameError,这就是我的预期。
据我了解,将参数"age"
提供给increase_attrib()
应该意味着提到的attrib
变为age
,以便increase_attrib()
引用self.age
而不是self.attrib
。显然,我错了。
现在,我可以使用increase_age()
代替,但是我必须为年龄和资金制定不同的方法,一旦我将其他功能添加到Actor
,就会有更多方法,例如地点,性别和国籍。
我需要做什么才能将属性名称传递给方法并让它更改该属性?
答案 0 :(得分:3)
您正在寻找setattr
:
setattr(obj, 'foo', 42)
与
相同obj.foo = 42
所以对你的例子来说:
def increase_attrib(self, attrib, increase_amount=1):
setattr(self, attrib, getattr(self, attrib, 0) + increase_amount)