面试题答案
一键面试class FunctionGeneratorMeta(type):
def __new__(cls, name, bases, attrs):
def create_function(cls, default_dict, *args):
def generated_function():
result = 0
operation = default_dict.get('operation')
if operation =='sum':
for arg in args:
if isinstance(arg, (int, float)):
result += arg
# 可以继续添加其他运算规则
return result
return generated_function
attrs['create_function'] = classmethod(create_function)
return super().__new__(cls, name, bases, attrs)
class MyClass(metaclass=FunctionGeneratorMeta):
pass
代码解释
- 元类
FunctionGeneratorMeta
:__new__
方法是元类创建新类的方法。在这个方法中,我们为即将创建的类(也就是MyClass
)添加一个类方法create_function
。create_function
是一个类方法,它接收cls
(代表类本身),default_dict
(默认参数,字典类型)和*args
(可变参数)。- 在
create_function
内部,定义了一个内部函数generated_function
。这个函数根据default_dict
中的运算规则(这里简单假设为'sum'
运算),对*args
中的数字进行运算。最后返回generated_function
,这个函数就是动态生成的函数。
- 类
MyClass
:- 它使用
FunctionGeneratorMeta
作为元类。通过这个元类,MyClass
获得了create_function
类方法。
- 它使用
- 默认参数和可变参数的传递、处理和应用:
- 传递:当调用
MyClass.create_function
时,default_dict
和*args
作为参数传递给create_function
类方法。 - 处理:在
create_function
内部,default_dict
被用于获取运算规则(例如'sum'
),*args
被用于遍历并对其中的数字进行相应运算。 - 应用:在
generated_function
内部,根据从default_dict
中获取的运算规则,对*args
中的数字进行运算,并返回结果。这个generated_function
就是最终动态生成并可以使用的函数。
- 传递:当调用
例如,可以这样使用:
default = {'operation':'sum'}
gen_func = MyClass.create_function(default, 1, 2, 3)
print(gen_func())
在上述示例中,default
字典作为默认参数传递,1, 2, 3
作为可变参数传递。create_function
根据 default
中的 'operation'
为 'sum'
,在 generated_function
中对可变参数 1, 2, 3
进行求和运算并返回结果。