Моя проблема в том, что я использую метакласс, чтобы обернуть определенные методы класса в таймер для целей регистрации.
Например:
class MyMeta(type):
@staticmethod
def time_method(method):
def __wrapper(self, *args, **kwargs):
start = time.time()
result = method(self, *args, **kwargs)
finish = time.time()
sys.stdout.write('instancemethod %s took %0.3f s.\n' %(
method.__name__, (finish - start)))
return result
return __wrapper
def __new__(cls, name, bases, attrs):
for attr in ['__init__', 'run']:
if not attr in attrs:
continue
attrs[attr] = cls.time_method(attrs[attr])
return super(MetaBuilderModule, cls).__new__(cls, name, bases, attrs)
Проблема, с которой я сталкиваюсь, заключается в том, что моя оболочка запускается для каждого '__init__', хотя я действительно хочу ее только для текущего модуля, для которого я создаю экземпляр.То же самое относится к любому методу времени.Я не хочу, чтобы время запускалось на любых унаследованных методах, ЕСЛИ они не переопределяются.
class MyClass0(object):
__metaclass__ = MyMeta
def __init__(self):
pass
def run(self):
sys.stdout.write('running')
return True
class MyClass1(MyClass0):
def __init__(self): # I want this timed
MyClass0.__init__(self) # But not this.
pass
''' I need the inherited 'run' to be timed. '''
Я пробовал несколько вещей, но до сих пор не добился успеха.