面试题答案
一键面试def my_decorator(func):
def wrapper(*args, **kwargs):
print("Before function call")
result = func(*args, **kwargs)
print("After function call")
return result
return wrapper
class MyMeta(type):
def __new__(mcs, name, bases, attrs):
for attr_name, attr_value in attrs.items():
if callable(attr_value) and not attr_name.startswith('__'):
attrs[attr_name] = my_decorator(attr_value)
return super().__new__(mcs, name, bases, attrs)
class MyClass(metaclass=MyMeta):
def instance_method(self):
print("This is an instance method")
-
装饰器
my_decorator
的作用:它是一个高阶函数,接受一个函数作为参数,并返回一个新的函数wrapper
。这个新函数在调用原始函数前后添加了额外的行为(这里是打印日志),实现了对函数功能的增强。 -
元类
MyMeta
的作用:元类是用于创建类的类。MyMeta
的__new__
方法在类创建过程中被调用。在这个方法中,遍历类的属性,对于每个实例方法(可调用且不是特殊方法),使用my_decorator
装饰器对其进行装饰,从而确保类的所有实例方法都被my_decorator
装饰。 -
协同工作方式:当定义
MyClass
类并指定metaclass=MyMeta
时,MyMeta
的__new__
方法会在MyClass
类创建时被调用。在__new__
方法中对MyClass
类的实例方法应用my_decorator
装饰器,这样MyClass
类的所有实例方法在类创建时就已经被装饰,当调用实例方法时,就会执行装饰器中定义的额外逻辑。
obj = MyClass()
obj.instance_method()
上述代码会先打印Before function call
,然后打印This is an instance method
,最后打印After function call
。