0

背景:

该项目涉及创建一个“管道”,该管道接收各种对象,其方法和属性用于驱动分析。这些对象应该从定义抽象方法和属性的抽象类继承。这样做的目的是,新开发人员可以通过覆盖现有类的方法来更改管道中的步骤,而无需完全了解管道的整个内部工作原理。将来也可以使用这些类构建不同的管道。

问题:

因为此管道的不同步骤可能需要不同的输入参数(例如,如果想要更改评估的定义,则该评估可能需要额外的参数,并且可能需要在运行时而不是硬编码到类中)。理想的情况是程序员可以从抽象类继承,重新定义签名以包含额外的参数,这些参数在运行时通过配置注入,而管道仍然使用原始签名调用这些方法。这将有效地为开发人员提供一个高度灵活的框架,因为您可以编写任何您想要的签名,只要您在运行脚本来处理它们时定义一个配置,同时也意味着管道永远不需要重写。

我的解决方案:

我的方法基本上是构建一个在运行时构建类的类工厂。这个想法是获取用户定义的类,将其拆分并获取其所有数据,用部分方法替换每个方法,并从这些新信息中返回一个新类。

代码:

class PartialClassFactory:
    """ Acts as a decorator so that the user can define what needs to be partialled at runtime."""
    def __init__(self, *method_attributes):
        self.method_attributes = method_attributes

    def __call__(self, cls):
        cls._update_attrs = self.method_attributes
        return cls

    def get_partial_cls(self, cls, config):
        partial_cls_attrs = dict(cls.__dict__)
        partial_methods = {}
        for method, attributes in cls._update_attributes:
            new_values = {
                attribute: config[attribute]
                for attribute in attributes
                if attribute in config.keys()
            }
            partial_methods[method] = partialmethod(cls.__dict__[method], **new_values)

        partial_cls_attrs = partial_class_attrs.update(partial_methods)
        partial_class_attrs.pop('__dict__')
        partial_class_attrs.pop('__weakref__')
        metaclass = type(cls)
        return metaclass(f"Configured{cls.__name__}", cls.__bases__, partial_class_attrs)

        return cls

@PartialClassFactory(('__init__', ('attr_to_replace')), ('method_a': ('attr_to_replace_')))
class ToBePartialled:
    """Not a real class, just demonstrating how the decorator would be used"""
    def __init__(self, attr_to_replace):
        self.attr_to_replace = attr_to_replace

    def method_a(attr_to_replace_):
        return attr_to_replace_ 

# Creating the new class would go something like
config = {'attr_to_replace': 1, 'attr_to_replace_': 2}
cls_factory = PartialClassFactory()
ConfiguredToBePartialled = cls_factory.get_partial_cls(ToBePartialled, config)

问题: - 这感觉很hacky,是否有更好的解决方案来解决我错过的问题?- 这个解决方案会有问题吗?原始类中是否有任何应该保留的数据?- 有没有更清洁的方法来实施上述解决方案?

4

0 回答 0