MST

星途 面试题库

面试题:Python函数默认参数、可变参数与元类结合应用

假设你正在开发一个框架,需要通过元类创建一系列函数,这些函数都有默认参数和可变参数。要求:1. 创建一个元类,使用该元类创建的类,其类方法需要接收一个默认参数(字典类型)和可变参数(任意类型)。2. 类方法要根据默认参数和可变参数的内容,动态生成一个函数,这个生成的函数需要处理默认参数和可变参数,并返回特定的结果(例如,对可变参数中的数字进行某种运算,运算规则由默认参数中的字典决定)。请写出完整的元类、类及相关函数代码,并详细解释整个实现过程中默认参数和可变参数是如何传递、处理和应用的。
11.0万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

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


代码解释

  1. 元类 FunctionGeneratorMeta
    • __new__ 方法是元类创建新类的方法。在这个方法中,我们为即将创建的类(也就是 MyClass)添加一个类方法 create_function
    • create_function 是一个类方法,它接收 cls(代表类本身),default_dict(默认参数,字典类型)和 *args(可变参数)。
    • create_function 内部,定义了一个内部函数 generated_function。这个函数根据 default_dict 中的运算规则(这里简单假设为 'sum' 运算),对 *args 中的数字进行运算。最后返回 generated_function,这个函数就是动态生成的函数。
  2. MyClass
    • 它使用 FunctionGeneratorMeta 作为元类。通过这个元类,MyClass 获得了 create_function 类方法。
  3. 默认参数和可变参数的传递、处理和应用
    • 传递:当调用 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 进行求和运算并返回结果。