我想使用元类实现一个工厂,它为来自不同来源的数据制作处理器。以下是基本代码:
class ProcessorFactory
def __call__(self, classname, supers, classdict):
...
def __New__(self, classname, supers, classdict):
...
def __int__(self):
...
class MQ_AddOn(object):
# MQ-specific code
class File_AddOn(object):
# Filesystem-specific code
class Web_AddOn(object):
# Web-specific code
class MQ_Processor(MQ_AddOn, metaclass=ProcessorFactory()):
# code common to all channels (MQ, Filesystem, Web)
class File_Processor(File_AddOn, metaclass=ProcessorFactory()):
# code common to all channels (MQ, Filesystem, Web)
class Web_Processor(Web_AddOn, metaclass=ProcessorFactory()):
# code common to all channels (MQ, Filesystem, Web)
我的问题是,是否有一种类似于汇编中的宏扩展的方法,可以将所有通道(MQ、文件系统、Web)的公共代码分离出来,这样就不必为这些类中的每一个复制代码
抱歉-我认为您必须对伪代码进行更多的扩展,以获得一个明确的答案
不复制代码的方法是使用Python中的常规继承机制——如果所有这些类都有通用的代码,只需将该代码放在一个通用基类中,该基类可能是一个mixin(即,不需要将其作为“唯一”基类),然后就可以设置
如果公共代码必须调用特定于每个子类的数据获取或处理方法,只需编写细粒度方法来执行该操作,并在公共方法中调用这些方法
此外,在这个过程中不需要“元类”或“内联宏扩展”——只需使用普通方法和更细粒度的方法
然后,在子类上实现那些解决特定通道特性的方法。这里没有什么大秘密
即使您需要做更多的事情,比如在每个步骤中从多个“叶”类调用步骤,您最好让您的类具有一个“管道”数据成员,如果这些步骤是按顺序注释和调用的,那么仍然不需要(也没有意义)涉及元类
在您的示例中,“基类”可以适合您提到的所有“通用代码”,并与多重继承一起使用:
(当你在一个元类中编写
__call__
和__new__
方法时,你可能会想‘好吧——这些都是可能有意义的元类相关的东西’——但是在一个元类中__int__
毫无意义:它提供了一种映射类的方法(不是一个实例,不是一些数据内容)到整数-即使您将这些类放在一个列表中,并且它们需要索引位于列表中,并且您想要交叉引用它们,您应该只向类添加一个自定义的“.index”属性,而不是在元类上写入__int__
)相关问题 更多 >
编程相关推荐