python - 组合中这个继承问题的解决方案
问题描述
我有一个 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()
推荐阅读
- actions-on-google - 如何让 Google Smart Home App 建议 Smart Home Actions
- javascript - 动态显示模态信息
- json - 使用正则表达式解析 json
- c - 如何在 C 中为我的班级修复这个随机数生成代码?
- python - 尝试运行 pyspark 时无法初始化主类 org.apache.spark.deploy.SparkSubmit
- android - 当调用的 TextEdit 值留空时,如何使我的 android 应用程序不崩溃?(科特林)
- python - 如何使用具有 __init__ 方法的子类创建一个空对象?
- java - java - 如何调用带有参数的方法到java中的toString方法?
- java - 在 Java 中创建日期和时间(不是 .now)
- html - 在浏览器上,为什么这个SVG图标的内部透明区域在较小的尺寸下会变灰