首页 > 解决方案 > 组合中这个继承问题的解决方案

问题描述

我有一个 python 具体类

class base
    def a():
        pass
    def b():
        pass
    def c():
        pass
    .
    .
    def z():
        pass

我想拥有 n 个具有相同方法集但实现不同的相似类(几乎没有 3-4 种方法不同)

由于我想重用代码,我正在考虑继承

class child1(base):
    def b():
        pass
    def c():
        pass

class child2(base):
    def g():
        pass
    def z():
        pass
    def i():
        pass
    def j():
        pass

class child3(base):
    def b():
        pass

问题: 由于前置条件和后置条件相同,不违反liskov替换原则。但是我不想使用继承如何通过组合来实现,以便我们可以最大限度地提高可重用性?是这样的吗

#abstract class
class a:
    def foo()

class a1(a):
    def foo():
        pass

class a2(a):
     def foo():
         pass

#abstract class
class b:
    def foo()

class b1(b):
    def foo():
        pass

class child1:
    obj1 = a2()
    obj2 = b1()
    .
    .
    obj3 = z5()

    def a():
        obj1.foo()
    .
    .
    def z():
        obj26.foo()

对于上述方法,我需要更多的类和逻辑来工厂逻辑来创建它们的对象。如果我添加更多的子类,这是否可以很好地扩展。或者我什至需要这个问题的课程?任何其他python方法来解决这个问题?

标签: pythonoopinheritancecomposition

解决方案


如果您不想使用继承,这里有一个建议:

# implementations of all methods:
def a1():
    print("a1")
def a2():
    print("a2")
def b1():
    print("b1")
def b2():
    print("b2")

# only one class needed
class Flexi:
    def __init__(self, funcs):
        for name, func in funcs.items():
            setattr(self, name, func)
    def a(self):
        pass
    def b(self):
        pass

然后,用某种工厂中的方法组合构造一个 Flexi 实例:

def create_flexi():
    funcs = {"a": a2, "b": b1}
    return Flexi(funcs)

example = create_flexi()
example.a()
example.b()

推荐阅读