【发布时间】:2019-05-10 16:04:12
【问题描述】:
我想创建一个元类,用跟踪装饰器装饰每个函数。
所以我得到了这个:
from functools import wraps
from inspect import getfile
from arrow import now
def trace(f):
@wraps(f)
def wrapper(*args, **kwargs):
print(
'{timestamp} - {file} - {function} - CALL *{args} ** {kwargs}'.format(timestamp=now().isoformat(sep=' '),
file=getfile(f),
function=f.__name__, args=args[1:],
kwargs=kwargs))
result = f(*args, **kwargs)
print(
'{timestamp} - {file} - {function} - RESULT {result}'.format(timestamp=now().isoformat(sep=' '),
file=getfile(f),
function=f.__name__,
result=result))
return result
return wrapper
class TraceLogger(type):
def __new__(mcs, name, bases, dct):
for attr in dct:
value = dct[attr]
if callable(value):
dct[attr] = trace(value)
return super(TraceLogger, mcs).__new__(mcs, name, bases, dct)
class ExampleClass(object):
__metaclass__ = TraceLogger
def foo(self):
print('foo')
@staticmethod
def bar():
print('bar')
example = ExampleClass()
example.foo()
example.bar()
跟踪适用于任何非静态函数,因为静态方法不可调用。 我怎样才能解开 staticmethod 然后在 new metclass 这样包装两次:
dct[attr] = staticmethod(trace(value))
【问题讨论】:
-
staticmethods are not callable是什么意思?它们是,否则你将无法调用它们 -
嗨@DeepSpace staticmethod 对象不满足这个条件如果 callable(value): dct[attr] = trace(value)
-
我明白了。您的问题归结为“为什么
callable(ExampleClass.bar)返回True而callable(ExampleClass.__dict__['bar'])返回False”,这是一个非常有趣的问题。也许您想稍微简化一下您的问题,因为这与元类无关。 -
staticmethod对象是描述符,当访问它们时,Python 返回一个可调用函数。它们本身确实是不可调用的。
标签: python python-2.7 python-2.x