2016-12-27 3 views
0

я в настоящее время имеет следующие два способа:Как инициализировать атрибуты класса?

class Venue: 
    store = Database.store() 
    ids = [vid for vid in store.find(Venue.id, Venue.type == "Y")] 

    def __init__(self): 
     self.a = 1 
     self.b = 2 

ИЛИ

class Venue: 

    @classmethod 
    def set_venue_ids(cls): 
     store = Database.store() 
     cls.ids = [vid for vid in store.find(Venue.id, Venue.type == "Y")] 

    def __init__(self): 
     self.a = 1 
     self.b = 2 

И перед использованием/инстанцирования класса я бы назвал:

Venue.set_venue_ids() 

Что бы быть правильным способом достижение этого?

Если это первый способ, что бы я сделал, если для создания атрибута потребовалась более сложная логика, которую можно было бы сделать проще с помощью функции?

Или существует совершенно другой способ структурирования моего кода для выполнения того, что я пытаюсь сделать?

+2

Почему вы хотите эти атрибуты являются атрибутами класса, а не атрибутами экземпляра? – valignatev

+0

@valentjedi В моем фактическом коде каждый объект объекта должен будет получить доступ к этому списку, чтобы делать проверки. –

+0

@Giri Итак, может ли этот параметр быть аргументом в некотором цикле? –

ответ

0

Из чисто технического POV класс является экземпляром его метакласса, поэтому инициализатор метакласса является очевидным кандидатом для инициализации атрибутов класса (по крайней мере, когда у вас есть что-то немного сложное).

Теперь дан каноническая жизнь объект класса (как правило, весь процесс), я бы определенно не использовать атрибут здесь - если кто-то добавляет или удаляют места из базы данных, в то время как ваш процесс запущен, ваши ids атрибутов выйти из синхронизации. Почему бы вам не использовать classmethod, чтобы убедиться, что ваши данные всегда обновлены?

О да, еще один способ построить ваш Venue.ids (или любой другой атрибут класса требует нетривиального кода) без сложного кода в классе верхнего уровня polluthing пространство имен класса (Вы заметили, что в первом примере store ? становится класс атрибуты тоже, а также vid при использовании Python 2.x) должны поместить код в простой функции и вызвать эту функцию из тела вашего класса оператора, то есть:

def list_venue_ids(): 
    store = Database.store() 
    # I assume `store.find()` returns some iterator (not a `list`) 
    # if it does return a list, you could just 
    # `return store.find(...)`.  
    return list(store.find(Venue.id, Venue.type == "Y")) 

class Venue(object): 
    ids = list_venue_ids() 
    def __init__(self): 
     self.a = 1 
     self.b = 2 
+0

По существу, я бы перебирал список объектов места, проверяя, был ли объект места в списке или нет, выполнял некоторые действия, а затем переходил к следующему месту. Даже если бы я использовал метод для обеспечения того, чтобы список был обновлен, может ли экземпляр не возникнуть, когда конкретное место было удалено из базы данных ПОСЛЕ того, как я обработал его в цикле? Я использую эту программу для запуска отчета, и если то, что я описал, произошло, мне пришлось бы повторно запустить программу, поскольку отчет теперь будет неправильным. –

+0

@ Giri, конечно, если это не длительный процесс, проблемы с заданными данными не являются большой проблемой ;-) - но тогда в чем смысл иметь этот список как атрибут вашего класса «Место проведения»? –

+0

Ну, я чувствовал, что если все экземпляры будут использовать список, возможно, я должен держать его в классе. Фактическое название класса, скорее всего, не будет «Место проведения». Я пытаюсь понять, есть ли лучший способ написать мой существующий код с использованием концепций ООП, хотя мне трудно понять, как разделить вещи на соответствующие классы. –

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