gpt4 book ai didi

python - 返回子类实例的父方法

转载 作者:行者123 更新时间:2023-11-28 16:36:02 25 4
gpt4 key购买 nike

将子类的实例作为父类实例的方法的输出返回是不好的做法吗?如果是的话,为什么?

例如,可以如下--

class Parent(object):
def __init__(self, attr):
self.attr = attr

def child(self, typ):
if typ == 'a':
return ChildA(self.attr)
else:
return ChildB(self.attr)

class ChildA(Parent):
pass

class ChildB(Parent):
pass

是个好设计?

最佳答案

如果有知识渊博的人回答这个问题,我将不胜感激,但由于这尚未发生,我将投入我的两分钱。


我认为这确实不是一个好的做法。出于多种原因,父类不应直接引用子类:

  • 首先,它阻碍了模块的 future 扩展。每当引入新的子类时,它可能也需要更新父类,以便在其实现中考虑这个新的子类。这打破了 open-closed principleSOLID principles of object-oriented programming .

  • 另一个缺点,至少在 Python 中,是它强制所有子类在同一个文件中定义,以避免循环导入。

  • 此外,由于指定的方法由子类继承,除非它被覆盖,否则它会触发“兄弟”类之间的某种熟悉,这可能是不希望的。

虽然可以通过一些编码工作来规避技术问题,但这种方法给程序员带来了不必要的负担。

我确信在某些情况下,让父类知道其子类似乎很有用,但我认为一般来说,这种情况会推断出设计错误和替代解决方案'涉及这种内省(introspection)应该受到追捧。

请注意,这并不意味着父对象不应该使用子对象。与所有其他对象一样,子对象可以作为参数合法接收或由其父对象的方法返回。父对象的方法甚至可以将它们视为普通的父对象,因为子对象也是父对象,这是面向对象编程的主要支柱之一。


关于您的特定示例,请考虑 factory design pattern .例如:

class Parent(object):
def __init__(self, attr):
self.attr = attr

class ChildA(Parent):
pass

class ChildB(Parent):
pass

class Factory(object):
def __init__(self, parent):
self.parent = parent

def create(self, <some_external_data>):
if <an algorithm that determines the desired type based
on some_external_data and the state of the parent>:
return ChildA(parent.attr)
else:
return ChildB(parent.attr)

关于python - 返回子类实例的父方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26033726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com