MST

星途 面试题库

面试题:Ruby元编程之复杂类行为动态修改

有一个模块`MyModule`,其中定义了多个类方法和实例方法。使用元编程技术,在运行时动态创建一个新类`DynamicClass`,该类混入`MyModule`,并且动态为`DynamicClass`添加类方法和实例方法,这些新方法需要根据运行时传入的参数动态决定其行为逻辑。请编写代码实现,并说明这种动态修改类行为在实际项目中的应用场景。
24.8万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试
class MyModule:
    @classmethod
    def class_method_in_module(cls):
        print("This is a class method in MyModule")

    def instance_method_in_module(self):
        print("This is an instance method in MyModule")


def create_dynamic_class(class_method_name, class_method_body, instance_method_name, instance_method_body):
    def dynamic_class_method(cls):
        exec(class_method_body)

    def dynamic_instance_method(self):
        exec(instance_method_body)

    DynamicClass = type('DynamicClass', (MyModule,), {})
    setattr(DynamicClass, class_method_name, classmethod(dynamic_class_method))
    setattr(DynamicClass, instance_method_name, dynamic_instance_method)
    return DynamicClass


# 示例调用
class_method_body = "print('This is a dynamically added class method')"
instance_method_body = "print('This is a dynamically added instance method')"
DynamicClass = create_dynamic_class('dynamic_class_method', class_method_body, 'dynamic_instance_method', instance_method_body)

DynamicClass.dynamic_class_method()
obj = DynamicClass()
obj.dynamic_instance_method()

应用场景

  1. 插件系统:在开发插件系统时,不同的插件可能需要根据配置动态添加或修改类的行为。例如,一个图形渲染引擎可能有各种插件,每个插件根据用户配置动态添加特定的渲染方法到渲染类中,实现不同的渲染效果。
  2. 测试框架:在测试过程中,有时需要动态修改类的行为以模拟不同的环境或条件。比如,在单元测试中,根据不同的测试用例动态为被测试类添加一些辅助方法,来验证特定的功能逻辑。
  3. 动态配置系统:对于一些需要根据运行时配置动态调整功能的应用,通过元编程动态修改类行为可以实现更灵活的配置。例如,一个电商系统根据不同地区的业务规则,动态为商品类添加计算税费、运费等不同逻辑的方法。