面试题答案
一键面试import time
class CallLoggerMeta(type):
def __new__(mcs, name, bases, attrs):
new_attrs = {}
for attr_name, attr_value in attrs.items():
if callable(attr_value) and not attr_name.startswith('__'):
def wrapper(func):
def wrapped(*args, **kwargs):
call_time = time.strftime('%Y-%m-%d %H:%M:%S')
instance = args[0]
instance.call_log.append((attr_name, call_time))
return func(*args, **kwargs)
return wrapped
new_attrs[attr_name] = wrapper(attr_value)
else:
new_attrs[attr_name] = attr_value
return super().__new__(mcs, name, bases, new_attrs)
class MyClass(metaclass=CallLoggerMeta):
call_log = []
def my_function(self):
print("Function is running.")
# 使用这个类
obj = MyClass()
obj.my_function()
print(obj.call_log)
上述代码中:
- 定义了元类
CallLoggerMeta
,在元类的__new__
方法中,遍历类的属性,对于非特殊方法的函数,创建一个包装函数,在包装函数中记录调用时间并将调用信息添加到类的call_log
列表中。 MyClass
类使用CallLoggerMeta
作为元类,该类中有一个my_function
方法。- 创建
MyClass
类的实例obj
,调用my_function
方法,然后打印call_log
列表查看调用信息。