2016-01-14 5 views
0

У меня есть этот код, который хранит имя, возраст и средства человека. Я пытаюсь написать метод, который может принимать «возраст» или «фонды» вместе с числом и увеличивать данный атрибут на это число.Как изменить атрибут объекта с помощью метода?

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() работает отлично: называя это увеличивает возраст Андреа до 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

, которую вы после 'SetAttr (я, атр, GetAttr (self, attrib) + увеличение_amount) '? Если это так, см. Http://stackoverflow.com/q/1167398/3001761 – jonrsharpe

ответ

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) 
Смежные вопросы