2013-06-19 2 views
1

Я пытаюсь изменить атрибут класса на основе приведенного аргумента. Я просто вхожу в python, но я не могу найти способ сделать это, не используя словарь. Есть ли питонический способ сделать это? Смотрите пример нижеИзменение атрибута класса переменной

class Ship: 

    def __init__(self, name): 
     self.name = name 
     ship_type = {"schooner": [50, 30, 18], 
      "galleon": [30, 14, 14] 
     } 
     self.max_weight = ship_type[name][0] 
     self.speed = ship_type[name][1] 
     self.poopdeck = ship_type[name][2] 

    def upgrade(self, attribute, value): 
     self.attribute += value 


Someship.ship.upgrade(speed, 10) 

Я могу выписать другой метод для каждого атрибута, но я чувствую, как будто там должно быть что-то вроде этого.
Я заранее извиняюсь, если об этом уже был дан ответ, но я не мог сказать это правильно, если есть.

ответ

0

Изменение способа обновления для обновления существующего атрибута, используя builtin functionshasattr(), setattr() и getattr().

def upgrade(self, attribute, value): 
    if hasattr(self, attribute): 
    setattr(self, attribute, getattr(self, attribute) + value) 
    else: 
    raise AttributeError("Can't upgrade non-existent attribute '{}'.".format(attribute)) 

Обратите внимание, что я также использовать атрибут __dict__, чтобы сделать настройки экземплярам проще:

class Ship: 
    # types is a class variable, and will be the same for all instances, 
    # and can be referred to by using the class. ie `Ship.types` 
    types = { 
    "schooner": {'weight':50, 'speed':30, 'poopdeck':18}, 
    "galleon": {'weight':30, 'speed':14, 'poopdeck':14}, 
    "default": {'weight':11, 'speed':11, 'poopdeck':11} 
    } 
    def __init__(self, name): 
    self.name = name 
    # we update the instance dictionary with values from the class description of ships 
    # this means that instance.speed will now be set, for example. 
    if name in Ship.types: 
     self.__dict__.update(Ship.types[name]) 
    else: 
     self.__dict__.update(Ship.types["default"]) 

    def upgrade(self, attribute, value): 
    if hasattr(self, attribute): 
     setattr(self, attribute, getattr(self, attribute) + value) 
    else: 
     raise AttributeError("Can't upgrade non-existent attribute '{}'.".format(attribute)) 

ship = Ship("schooner") 
print(ship.speed) #=> 30 
ship.upgrade("speed", 10) 
print(ship.speed) #=> 40 
+0

Святое дерьмо. Потрясающие. Это даже показывает мне некоторые другие интересные вещи. – Faller

0

Вы ищете функции setattr и getattr. Ваш метод upgrade может быть реализован как

def upgrade(self, attribute, value): 
    setattr(self, attribute, getattr(self, attribute) + value) 
+0

Он врезается в той же точке для меня. Когда я пытаюсь позвонить: Someship.ship.upgrade (скорость, 10) он говорит, что скорость не определена Спасибо за помощь кстати – Faller

+0

Вам необходимо передать имя атрибута в виде строки: 'Someship.ship. upgrade ('speed', 10) '. Или передайте переменную, значение которой является именем атрибута: 'attr = 'speed'; Someship.ship.upgrade (attr, 10) '. – chepner

+0

Красивые. Огромное спасибо. – Faller

Смежные вопросы