【问题标题】:Solution for this inheritance problem in composition组合中这个继承问题的解决方案
【发布时间】:2020-10-01 18:58:55
【问题描述】:

我有一个 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方法来解决这个问题?

【问题讨论】:

  • 请发布有效的 Python 代码。 // 在 Python 中不是注释,垂直点也不是。 (如果您想指示任意代码块,单独的省略号 (...) 本身是一个有效的语句。而注释本身不是一个有效的函数体;使用 pass。
  • 这不是你可以一概而论的。你是使用继承还是组合取决于类是的东西还是仅仅使用它。加法 一个操作,而 HttpClient 使用 一个连接,即使它们共享接口的一部分。
  • 如果不知道你的类或这些方法应该做什么,就不可能知道你是否违反了 Liskov 替换原则。计算机科学是一门艺术,而不是一门科学。
  • 看起来您的类只是用作某些方法的集合。这是正确的吗?
  • @Wups 这里的问题我有一个通用的接口和实现是不同的,除了少数之外,大多数方法都有相同的实现。假设前置条件和后置条件相同,在子类中使用继承覆盖实现类的方法是否违反liskov替换原则

标签: python oop inheritance composition


【解决方案1】:

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

# 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()

【讨论】:

    猜你喜欢
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    相关资源
    最近更新 更多