2015-10-27 2 views
5

Считается, что у плохой практики есть класс, определенный в файле __init__.py? У меня есть случай, похожий на калькулятор налога. Я хочу иметь класс калькулятора, а затем набор специфических для штата классов калькулятора налогов, которые класс калькулятора ссылается на внутреннюю систему. Что-то вроде:Python __init__.py и классы

class TaxCalculator(): 

    def __init__(self): 
     self.ca_tax_calculator = CATaxCalculator() 
     self.ny_tax_calculator = NYTaxCalculator() 

    def get_tax_calculator_for_state(self, state): 
     tax_calculator = None 
     if state == "CA": 
      tax_calculator = self.ca_tax_calculator 
     else: 
      tax_calculator = self.ny_tax_calculator 
     return tax_calculator 

    def calculate(self, purchase_info): 
     return self.get_tax_calculator_for_state(purchase_info.state).calculate(purchase_info.amount) 

Структура каталога Я думаю о том, как это выглядит:

/calculators/__init__.py 
/calculators/ca.py 
/calculators/ny.py 

И __init__.py размещался функцию "TaxCalculator".

Классы будут ссылающихся калькуляторов, то есть:

from calculators import TaxCalculator 

calculator = TaxCalculator().calculate(purchase_info) 

Это считается плохой практикой или на самом деле не Pythonic?

+2

Я не уверен, что это полное решение, которое вы ищете, но следующее сообщение Stackoverflow имеет хорошее объяснение того, как оно обычно используется. http://stackoverflow.com/a/18979314/4194964 Обсуждает переменные уровня модуля и то, как файл __init__.py должен быть тонким, чтобы избежать нарушения «явной, лучше неявной» философии –

ответ

3

Обычно файл __init__.py используется для инициализации вашего пакета, например, импорта материала, добавления местоположения на ваш путь, определения версий или выявления предметов с помощью __all__, но часто он также пуст. Однако я рекомендую вам предоставить более крупные классы/функции своим собственным файлам. Это гораздо удобнее обслуживать.

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