2016-10-17 3 views
0

У меня есть следующая простая модель в Peewee:методы получения и установки в Peewee модели

class SiteText(BaseModel): 
    url = TextField() 
    text = TextField() 
    my_counter = IntegerField() 

    def get_text_by_url(url): 
     d = [s.text for s in SiteText.select(SiteText.url == url)] 
     d = d[0] if len(d) > 0 else None 
     return d 

    def save_text(updates): 
     # updates is a dict containing, url, text, my_counter 
     SiteText.upsert(**updates) 

    def get_outage_counter(url): 
     c = [c.my_counter for c in SiteText.select(SiteText.url == url)] 
     c = c[0] if len(c) > 0 else None 
     return c 

    def set_outage_counter(url, counter): 
     c = SiteText.get(SiteText.url == url) 
     c.counter = counter 
     c.save() 

Тем не менее, чувствует себя довольно странные письма геттеры и сеттеры для некоторых атрибутов. Есть ли более питонический способ сделать это? Должен ли я, например, иметь один метод получения и установки счетчика сбоев для указанного URL? Должен ли я преобразовать функции getter и setter в свойства (хотя тогда они будут сталкиваться с фактическими атрибутами). Обратная связь приветствуем!

ответ

1

Фактическое использование пропорций не будет конфликтовать с вашим фактическим именем атрибута, поскольку они могут отличаться от функции getter/setter.

class Example: 
    def __init__(self): 
     self.value = 5 

    @property 
    def value(self): 
     print('Entering value getter') 
     return self._value 

    @value.setter 
    def value(self, val): 
     print('Entering value setter') 
     self._value = val 

Скажем, у нас есть класс, как указано выше. Вы можете видеть, что функция getter возвращает _value, что может показаться странным для тех, кто увидит, что в методе __init__ есть только self.value = 5, но не self._value.

Пусть говорят, что мы делаем, это следующее:

a = Example() 

Сразу после создания объекта класса, __init__ называет value.setter функцию из-за self.value = 5, и из-за того, что мы получили:

a = Example() 
Entering value setter 
print(a.value) 
Entering value getter 
5 
print(a.__dict__) 
{'_value': 5} # _value was created in setter function 

Итак, как вы можете видеть, вы можете использовать свойство таким образом и быть в порядке с ним.

+0

Будет ли это работать и в модели БД? Например, 'my_counter' должен быть определен как атрибут верхнего уровня и не нуждается в инициализации через' __init__'. Я так думаю, что он определен как класс «Поле». – mart1n

+0

Существует способ использовать что-то вроде 'counter = property (getter_func, setter_func, del_func)', и он должен позволить вам использовать 'obj.counter', который будет вызывать getter_func или' obj.counter = 5', который вызывал бы функция setter func и т. д. – Nf4r

+0

Спасибо, я решил использовать другой подход в конце, где я изменяю модель на месте, а не ее отдельные атрибуты. Тем не менее, ваше решение может работать так, чтобы принять правильный ответ. – mart1n

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