在很多类上定义相同的方法覆盖:DRY?

时间:2015-09-17 13:08:25

标签: python python-3.x

假设我有一个由大型库代码库的import定义的大量类,我不想因为可维护性而不知所措。它们都继承自BaseClass,而BaseClass包含一个我想要扩充的方法。我认为以下是一个可行的解决方案

class MyMixin(object):
   def method( self, args):  
      ... # 1. a few lines of code copied from BaseClass's def of method
      ... # 2. some lines of my code that can't go before or after the copied code
      ... # 3. and the rest of the copied code

class MyAbcClass( MyMixin, AbcClass): 
   pass
# many similar lines
class MyZzzClass( MyMixin, ZzzClass): 
   pass

问题。有没有办法比较一个("MyXxxClass", XxxClass)元组列表,并编写定义MyXxxClasses的代码?它是否足以理解它在上面的重复中击败了它?

1 个答案:

答案 0 :(得分:1)

使用三个{arg type来定义类,然后在the module's global dictionary上设置它们:

todefine = [('MyAbcClass', AbcClass), ...]
for name, base in todefine:
    globals()[name] = type(name, (MyMixin, base), {})

如果要定义的名称遵循您给出的固定模式(`"我的" +基类名称),您可以通过动态构造名称来重复自己:

todefine = [AbcClass, ...]
for base in todefine:
    name = "My" + base.__name__
    globals()[name] = type(name, (MyMixin, base), {})

如果您尝试从给定模块中包装所有类,则可以通过内省模块以编程方式生成todefine来避免显式列出类(如果您知道模块有或没有{{1}你可以使用适当的方法,而不是尝试一个,并默认为另一个):

__all__