如果两个类扩展不同的类,如何避免重复代码



我有两个类,它们扩展了两个不同的基类。这些类设置自定义环境。

这三种方法在两个类中都很常见:prepare()setup()teardown()。每个方法都重写基类方法。(它们也有super()调用。(此外,ExtendedBase扩展了Base

一流

ClassA(Base):
def __init__(self, args):
super().__init__(args)
self._private = OtherClass()
def prepare(self, args):
super().prepare(args)
self._private.prepare()
def setup(self, args):
super().setup(args)
self._private.setup(self._smth, args)
def teardown(self):
self._private.teardown()
super().teardown()

二等

ClassB(ExtendedBase):
def __init__(self, args):
super().__init__(args)
self._private = OtherClass()
def prepare(self, args):
super().prepare(args)
self._private.prepare()
def setup(self, args):
super().setup(args)
self._private.setup(self._smth, args)
def teardown(self):
self._private.teardown()
super().teardown()

这是避免重复方法的一种方法吗?我曾考虑过Environment类的多重继承,它将包含重复的方法,但我对如何实现这一点以及这是否是一个好主意感到困惑。

编辑:不幸的是,我无法对类层次结构做任何事情。ClassAClassB应该继承相应的类并重写或使用父级的方法。

这看起来很像使用类mixin:的典型情况

class BuildMixin:
def __init_(self, args):
super().__init__(args)
self._private = OtherClass()
def prepare(self, args):
super().prepare(args)
self._private.prepare()
def setup(self, args):
super().setup(args)
self._private.setup(self._smth, args)
def teardown(self):
self._private.teardown()
super().teardown()
class ClassA(BuildMixin, Base):
pass
class ClassB(BuildMixin, ExtendedBase):
pass

为了便于说明,这里有一堆伪类,它们遵循您的示例并使用mixin。根据您的问题,不清楚OtherClass应该是什么,但它似乎也有prepareteardownsetup方法:

class OtherClass:
def prepare(self,arg):
print('OC perparing')
def teardown(self):
print('OC tearing down')
def setup(self, smth, args):
print('OC setting up')
class Base:
def __init__(self, args):
print('Base init')
self._smth=args
def prepare(self,arg):
print('Base perparing')
def teardown(self,):
print('base tearing down')
def setup(self,args):
print('base setting up')
class ExtendedBase:
def __init__(self, args):
print('ExtBase init')
self._smth=args
def prepare(self, arg):
print('ExtBase perparing')
def teardown(self):
print('ExtBase tearing down')
def setup(self, arg):
print('ExtBase setting up')
class BuildMixin:
def __init__(self, arg):
super().__init__(arg)
self._private = OtherClass()
def prepare(self, args):
super().prepare(args)
self._private.prepare(args)
def setup(self, args):
super().setup(args)
self._private.setup(self._smth, args)
def teardown(self):
self._private.teardown()
super().teardown()
class  ClassA(BuildMixin, Base):
pass
class ClassB(BuildMixin, ExtendedBase):
pass

a = ClassA(1)
# prints:
# Base init
b = ClassB(1)
# prints:
# ExtBase init
a.prepare(1)
# prints:
# Base perparing
# OC perparing
b.prepare(1)
# prints:
# ExtBase perparing
# OC perparing
# and so on...

最新更新