Перед тем, как начать - действительно ли опубликованный код является вашим реальным кодом?Это на самом деле не работает для меня в Python 3.2 - я немного исправил.Вот что я изменил для начала:
class_dict = list()
теперь
class_dict = {}
и в OverloadedFunction.__call__
:
for fkey, function in class_dict.items():
inspect_t = inspect.getfullargspec(function)
print(inspect_t)
в member_dict.__setitem__
:
if value.__class__.__name__ == "function":
class_dict[key] = value
dict.__setitem__(self,key,OverloadedFunction(key,value))
Я полагаю, это то, что вы хотели.Я никогда не получал ошибку NoneType not callable
- с этими изменениями (плюс import inspect
вверху) ваш код работает и печатает спецификацию аргумента:
$ python3 temp.py
FullArgSpec(args=['self', 'a', 'b'], varargs=None, varkw=None, defaults=None, kwonlyargs=[], kwonlydefaults=None, annotations={'a': <class '__main__.Asteroid'>, 'b': <class '__main__.Asteroid'>})
Теперь вы хотите реализовать мультиметод -внесенные мною модификации исключают, что, поскольку ваши мультиметоды перезаписываются при каждом вызове на __setitem__
, поэтому вы можете работать оттуда (возможно, вместо этого используйте collections.defaultdict(list)
и append
до class_dict[key]
).
Могу ли япредложить что-нибудь?Я не думаю, что вам нужен метакласс - http://www.artima.com/weblogs/viewpost.jsp?thread=101605 обеспечивает реализацию мультиметода для Python 2.x, это очень просто.