Вот относительно простой способ сделать это (хотя я рекомендую в конце изменить имя функции input
, потому что она конфликтует со встроенным с тем же именем):
class color:
_func_map = {}
def __init__(self, case):
self.case = case
def __call__(self, f):
self._func_map[self.case] = f
return f
@classmethod
def switch(cls, case):
cls._func_map[case]()
@color('pink')
def _pink_power():
print("wow")
@color('blue')
@color('red')
def _powerpower():
print("god!!!!")
def input(colorname):
color.switch(colorname)
input('pink') # -> wow
input('blue') # -> god!!!!
input('red') # -> god!!!!
Улучшение
Вы можете поддерживать регистр по умолчанию, такой как поддержка операторов switch
в C / C ++, который будет использоваться при отсутствии соответствия colorname
:
class color:
DEFAULT = '_DEFAULT'
def _default(): raise ValueError('Unknown color!')
_func_map = {DEFAULT: _default}
def __init__(self, case):
self.case = case
def __call__(self, f):
self._func_map[self.case] = f
return f
@classmethod
def switch(cls, case):
cls._func_map.get(case, cls._func_map[cls.DEFAULT])()
Метод _default()
, добавленный в класс, вызывает исключение при его вызове:
input('lavender') # -> ValueError: Unknown color!
Однако вы можете переопределить это, определив свой собственный:
@color(color.DEFAULT) # Define custom color default.
def my_default():
print("loser!")
input('lavender') # -> loser!