MST

星途 面试题库

面试题:Python函数定义与调用之元类与函数行为定制

使用元类来创建一个类,该类中的所有函数(不包括特殊方法)在被调用时,会自动记录调用时间,并将调用信息(函数名、调用时间)存储在一个类属性的列表中。请实现这个元类以及相应的类,并展示如何使用这个类。
42.2万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
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)

上述代码中:

  1. 定义了元类CallLoggerMeta,在元类的__new__方法中,遍历类的属性,对于非特殊方法的函数,创建一个包装函数,在包装函数中记录调用时间并将调用信息添加到类的call_log列表中。
  2. MyClass类使用CallLoggerMeta作为元类,该类中有一个my_function方法。
  3. 创建MyClass类的实例obj,调用my_function方法,然后打印call_log列表查看调用信息。