Непросто, но если вы используете Python 3, это должно работать:
registry = {}
class MetaRegistry(type):
@classmethod
def __prepare__(mcl, name, bases):
def register(*props):
def deco(f):
registry[name + "." + f.__name__] = props
return f
return deco
d = dict()
d['register'] = register
return d
def __new__(mcl, name, bases, dct):
del dct['register']
cls = super().__new__(mcl, name, bases, dct)
return cls
class my_class(object, metaclass=MetaRegistry):
@register('prop1','prop2')
def my_method( arg1,arg2 ):
pass # method code here...
@register('prop3','prop4')
def my_other_method( arg1,arg2 ):
pass # method code here...
print(registry)
Обратите внимание, что вы не можете иметь имена методов, равные имени декоратора в мета-типизированном классе, потому что они автоматическиудалено командой del
в метаклассе __new__
.
Для Python 2.6 я думаю, вам придется явно указать декоратору имя класса для использования.