假设我有一个由大型库代码库的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的代码?它是否足以理解它在上面的重复中击败了它?
答案 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__