Есть ли более чистый питонический способ игнорировать вызовы неинициализированных атрибутов? - PullRequest
0 голосов
/ 24 мая 2018

У меня есть класс, который используется на нескольких станциях при настройке, и каждая настройка инициализирует различный набор оборудования.В качестве примера изображения оборудования, которое я поддерживаю: дом, машина и велосипед.

class Site():
    def __init__(self, has_house, has_car, has_bike):
        self.house = init_house() if has_house else None
        self.car = init_car() if has_car else None
        self.bike = init_bike() if has_bike else None

    def switch_off(self):
        if self.house:
            self.house.switch_off()
        if self.car:
            self.car.switch_off()
        if self.bike:
            self.bike.switch_off()

Теперь вместо того, чтобы проверять каждый объект.Я ищу способ сделать что-то вроде этого:

    def switch_off(self):
        self.house.switch_off()
        self.car.switch_off()
        self.bike.switch_off()

Я ожидаю, что код будет игнорировать атрибуты, которые не инициализированы.Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Вместо этого может потребоваться словарь атрибутов.

def __init__(self, has_house, has_car, has_bike):
    self.things = {}
    if has_house:
        self.things['house'] = init_house()
    if has_car:
        self.things['car'] = init_car()
    if has_bike:
        self.things['bike'] = init_bike()

def switch_off(self):
    for thing in self.things.values():
        thing.switch_off()
0 голосов
/ 24 мая 2018

Вы можете использовать getattr:

def switch_off(self):
   for i in self.__dict__.values():
     getattr(i, 'switch_off', lambda :None)()

Или, без цикла, для ясности:

def switch_off(self):
  getattr(self.house, 'switch_off', lambda :None)()
  getattr(self.car, 'switch_off', lambda :None)()
  getattr(self.bike, 'switch_off', lambda :None)()

getattr предоставляет возможность передать необязательный третий параметр:возвращаемое значение, если переданный объект не имеет требуемого атрибута.В этом случае, если house, car или bike равно None, будет возвращен и вызван lambda вместо исходного атрибута switch_off.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...