私は一連のモジュールを持っています。各モジュールには、コンポジションを介してクラスにミックスしたい動作が含まれています。これらの各モジュールにはいくつかの共通コードと冗長コードがあるため、各モジュールにインポートできる基本モジュールを抽出して、ボイラープレートを切り取りながらカスタム コードを埋めようとしました。私のコードの簡略版は以下のとおりです。
main.py:
import concrete as steak_sauce
class Customer():
def __init__(self):
self.allergies = ["onions"]
self.dish = []
def register_ingredient (steak_sauce):
self.dish.append(ingredient)
customer = Customer()
customer.eat_if_not_allergic(steak_sauce)
base.py:
# Base module
menu_item_name = "default"
menu_item_ingredients = []
def is_allergic(customer):
if menu_item_name in customer.allergies:
return True
else:
add_to_dish(menu_item_name)
def eat_if_not_allergic(customer):
if not is_allergic(customer):
eat_it(ingredient)
コンクリート.py:
from base import *
menu_item_name = "steak sauce"
menu_item_ingredients = ["MSG", "Blood"]
def eat_it(customer):
print "custom logic acting on customer goes here"
main.py を実行すると、例外が発生します。
Traceback (most recent call last):
File "main.py", line 14, in <module>
customer.add_if_not_allergic(steak_sauce)
File "main.py", line 10, in add_if_not_allergic
if not ingredient.is_allergic(customer):
File "/home/chazu/tests/base.py", line 10, in is_allergic
add_to_dish(menu_item_name)
NameError: global name 'eat_it' is not defined
私の質問は次のとおりです。モジュールの機能を拡張する方法、または逆に複数のモジュールから共通の機能を基本モジュールに抽出する方法はありますか? Pythonicの方法は何ですか?
よろしくお願いします=)