在父类中创建子类对象

时间:2019-12-02 19:03:33

标签: python class inheritance

像下面的示例一样,在父级中创建子类的对象是一个好的设计,它似乎正在工作,但是它是一个好的设计,有没有更好的方法呢?

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

2 个答案:

答案 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