这里有一个相对简单的方法(虽然我建议你在末尾更改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!!!!
增强
您可以支持在没有匹配的colorname 时使用默认情况,例如 C/C++ 的 switch 语句支持:
class color:
DEFAULT = '_DEFAULT'
_func_map = {}
def __init__(self, case):
self.case = case
def __call__(self, f):
self._func_map[self.case] = f
return f
@classmethod
def _default(cls):
raise ValueError('Unknown color!')
@classmethod
def switch(cls, case):
cls._func_map.get(case, cls._default)()
添加到类中的_default() 方法在调用时会引发异常:
input('lavender') # -> ValueError: Unknown color!
但是您可以通过定义自己的错误处理函数来覆盖它:
@color(color.DEFAULT) # Override default function.
def my_default():
print("loser!")
input('lavender') # -> loser!