像下面的示例一样,在父级中创建子类的对象是一个好的设计,它似乎正在工作,但是它是一个好的设计,有没有更好的方法呢?
class parent(object):
def __init__(self):
print('Im running')
def execute(self):
x = child()
x.run()
x.myfun()
def myfun(self):
print('parent function')
def run(self):
print('parent running')
class child(parent):
def __init__(self):
super().__init__()
print('Im running too')
def run(self):
print('child running')
f = parent()
f.execute()
答案 0 :(得分:1)
对于您的问题,这绝对不是一个好的设计,通常也不是一个好的设计(我无法想到的例外),并且绝对违反OOP设计和SOLID原则。
仅在OOP设计或任何其他软件工程的思想框架中,您需要明确的关系。这使您的父类和子类之间的关系本质上更加复杂。更不用说大多数其他语言(至少是运行编译代码的语言)不会允许这种事情发生。
如果您需要一个实例,而反之亦然,则继承可能是错误的模式,因为与使用继承的方案不同,您的类似乎是以双向方式连接的。
答案 1 :(得分:1)
execute
根本不使用self
的事实表明它应该是一个类方法,在这种情况下,您可以使用实际上提供的任何类来实例化x
。 / p>
完成此操作后,Parent
的定义将不再依赖于任何特定的子类。实际上,它完全不依赖于Parent
被完全归为 的事实; Parent.execute()
将继续工作。
例如,
class Parent:
def __init__(self):
print('Im running')
@classmethod
def execute(cls):
x = cls()
x.run()
x.myfun()
def myfun(self):
print('parent function')
def run(self):
print('parent running')
class Child(Parent):
def __init__(self):
super().__init__()
print('Im running too')
def run(self):
print('child running')
Child.execute()
这将输出
Im running
Im running too
child running
parent function
由于未定义Child.execute
,因此解析为Parent.execute
。但是Child
仍然是第一个传递的参数。结果,x
将是Child
的实例,而不是Parent
。因此x.run()
运行Child.run
,而x.myfun()
运行Parent.myfun
。
尽管Parent.execute
仍然取决于x
具有cls
特定属性的事实,这表明您应该推迟限制execute
仅使用{ {1}},并让孩子覆盖Parent
以添加任何特定于孩子的行为。
或者,execute
应该是一个实例方法,但是它应该简单地调用execute
,从而给调用者带来负担,使其可以通过适当的方式调用self.fun
对象。
execute