2016-11-19 2 views
0

Я новичок в Python.Свойство Python с геттерами и сеттерами

Я хочу иметь класс под названием «Вербность». Он предназначен для управления объемом печатной продукции моей новой программы Python.

Многословие должно быть постоянным во время работы моей программы, поэтому я намеревался инициализировать объект Verbosity уровнем требуемой детализации. Позволяет вызвать экземпляр этого объекта «глагол».

Пока моя программа работает, я часто хочу проверить многословие, чтобы программа знала, когда печатать выходные данные или нет. Таким образом, я хочу вызвать verb.high, verb.low и т. Д. И вернуть true или false.

Вот некоторые примеры кода (на основании некоторого кода в некотором пакете я нашел), но он пока не работает в моей программе:

VERB_QUIET = 0 
VERB_LOW = 1 
VERB_MEDIUM = 2 
VERB_HIGH = 3 
VERB_DEBUG = 4 

class Verbosity(object): 
    """Class used to determine what to print to standard output. 

    Attributes: 
     level: Determines what level of output to print. 
    """ 
    value = "low" 

    def __init__(self, new_value="low"): 

     self.level = new_value 

    def __getattr__(self, name): 
     """Determines whether a certain verbosity level is 
     less than or greater than the stored value. 

     Args: 
      name: The verbosity level at which the info/warning string 
       will be output. 
     """ 

     if name is "quiet": 
      return self.level >= VERB_QUIET 
     elif name is "low": 
      return self.level >= VERB_LOW 
     elif name is "medium": 
      return self.level >= VERB_MEDIUM 
     elif name is "high": 
      return self.level >= VERB_HIGH 
     elif name is "debug": 
      return self.level >= VERB_DEBUG 

    def __setattr__(self, name, value): 
     """Sets the verbosity level 

     Args: 
      name: The name of what to set. Should always be 'level'. 
      value: The value to set the verbosity to. 

     Raises: 
      ValueError: Raised if either the name or the level is not 
       a valid option. 
     """ 

     if name == "level": 
      if value == "quiet": 
       level = VERB_QUIET 
      elif value == "low": 
       level = VERB_LOW 
      elif value == "medium": 
       level = VERB_MEDIUM 
      elif value == "high": 
       level = VERB_HIGH 
      elif value == "debug": 
       level = VERB_DEBUG 
      else: 
       raise ValueError("Invalid verbosity level " + str(value) + " specified.") 
      super(Verbosity, self).__setattr__("level", level) 

Если у вас есть лучший подход, я бы рад слышать что. Тем не менее мне также будет интересно узнать, как работать над этим подходом.

+0

* «он еще не работает» * * Вы могли бы расширить то, что это означает *, точно ? Дайте [mcve]. Обратите внимание, что вам не следует сравнивать строки по * identity * ('x is y'), но * равенство * (' x == y'). – jonrsharpe

+0

Используйте модуль 'logger'. – Daniel

+0

Вы можете написать пользовательский дескриптор (https://docs.python.org/3/howto/descriptor.html), чтобы сократить шаблонный шаблон, но использование проверенных стандартных функций библиотеки, вероятно, является лучшей идеей , – jonrsharpe

ответ

0

См. Модуль Python in-built logging. Нет необходимости повторно изобретать колесо.

Вот пример из документации:

import logging 
logging.warning('Watch out!') # will print a message to the console 
logging.info('I told you so') # will not print anything 

Если вы хотите, чтобы установить уровень ведения журнала, так что INFO + с более высоким приоритетом сообщения печатаются:

logging.getLogger().setLevel(logging.INFO) 

Я также рекомендую придерживаясь уровней регистрации, перечисленных ниже:

enter image description here

+0

Большое спасибо за подробный ответ. Это здорово, что мне не нужно изобретать колесо ... :-) – Jadzia

0

При попытке создать более хороший пример кода в соответствии с просьбой jonrsharpe, к моему удивлению, я получил код из выше работает. Но я все еще намерен использовать модуль регистрации Python ... :-)

Проблема была в основном в том, как я пытался использовать класс многословия. Здесь, в приведенном ниже коде, как его использовать. (Я не знаю, что я делал раньше, я очень сильно изменил код ...)

class Simulation(object): 

    def __init__(self, verbosity_level="low"): 

     self.verbosity = Verbosity(verbosity_level) 


VERB_QUIET = 0 
VERB_LOW = 1 
VERB_MEDIUM = 2 
VERB_HIGH = 3 
VERB_DEBUG = 4 

class Verbosity(object): 
    value = "low" 

    def __init__(self, verbosity_level="low"): 

     self.level = verbosity_level 

    def __getattr__(self, name): 

     if name == "quiet": 
      return self.level >= VERB_QUIET 
     elif name == "low": 
      return self.level >= VERB_LOW 
     elif name == "medium": 
      return self.level >= VERB_MEDIUM 
     elif name == "high": 
      return self.level >= VERB_HIGH 
     elif name == "debug": 
      return self.level >= VERB_DEBUG 

    def __setattr__(self, name, value): 

     if name == "level": 
      if value == "quiet": 
       level = VERB_QUIET 
      elif value == "low": 
       level = VERB_LOW 
      elif value == "medium": 
       level = VERB_MEDIUM 
      elif value == "high": 
       level = VERB_HIGH 
      elif value == "debug": 
       level = VERB_DEBUG 
      else: 
       raise ValueError("Invalid verbosity level " + str(value) + " specified.") 
      super(Verbosity, self).__setattr__("level", level) 


sim = Simulation(verbosity_level = "medium"); 
if sim.verbosity.high: 
    print "Simulation is starting" 
+0

Это только полезный ответ, если вы объясните, что вы делали неправильно в исходной версии, что вы изменили и как это исправлено. Рад, что вы его отсортировали! – jonrsharpe

+0

Правый @ jonrsharpe. Я также изменил «is» на «==». – Jadzia

+0

Все еще интересно, если это лучший способ сделать это, если вы хотите реализовать его самим. Например.есть также функции getattr() и setattr(), это действительно самый лучший способ вызвать super(), ... – Jadzia

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