Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 组合中此继承问题的解决方案_Python_Oop_Inheritance_Composition - Fatal编程技术网

Python 组合中此继承问题的解决方案

Python 组合中此继承问题的解决方案,python,oop,inheritance,composition,Python,Oop,Inheritance,Composition,我有一个python的具体类 class base def a(): pass def b(): pass def c(): pass . . def z(): pass 我希望有n个具有相同方法集但不同实现的类似类(3-4个方法几乎没有区别) 因为我想重用代码,所以我正在考虑继承 class child1(base): def b(): pass d

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

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

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

请发布有效的Python代码<代码>/在Python中不是注释,垂直点也不是注释。(如果要指示任意代码块,请使用一个省略号(
)本身是有效语句。注释本身不是有效的函数体;请使用pass。这不是您可以概括的内容。使用Inherenence还是composition取决于类是某个内容还是仅使用它。Addition是HttpClient使用连接时的操作,即使它们共享接口的一部分。Wi虽然不知道你的类或者这些方法应该做什么,但是不可能知道你是否违反了Liskov替换原则。计算机科学是一门艺术,而不是一门科学。看起来你的类只是一些方法的集合。这是对的吗?@Wups这里的问题我有一个共同的界面e和实现不同,除了少数方法外,大多数方法都有相同的实现。假设前提条件和后条件相同,使用继承并重写子类中已实现类的方法是否违反liskov替换原则