【发布时间】: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