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

2024-10-03 02:35:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这两个类中共有三种方法: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应该继承相应的类并重写或使用父类的方法


Tags: 方法selfbaseinitdefsetupargsprivate
1条回答
网友
1楼 · 发布于 2024-10-03 02:35:11

这看起来很像使用类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...

相关问题 更多 >