面试题答案
一键面试def check_param_type(func):
def wrapper(self, param):
if not isinstance(param, int):
raise TypeError("param must be of type int")
return func(self, param)
return wrapper
class MyMeta(type):
def __new__(cls, name, bases, attrs):
if'my_method' in attrs:
attrs['my_method'] = check_param_type(attrs['my_method'])
return super().__new__(cls, name, bases, attrs)
class MyClass(metaclass=MyMeta):
def my_method(self, param):
pass
在这个过程中,元类 MyMeta
的 __new__
方法在创建 MyClass
类对象时被调用。在 __new__
方法中,检查 MyClass
类属性中是否有名为 my_method
的方法。如果存在,使用 check_param_type
装饰器对该方法进行包装。check_param_type
装饰器在 my_method
方法被调用时,检查传入的 param
参数是否为 int
类型,若不是则抛出 TypeError
异常。这样就实现了函数参数检查与元类机制的协同工作,在类创建时就对方法参数检查逻辑进行了设置。