【发布时间】:2021-02-10 15:36:43
【问题描述】:
我想覆盖一个类中的继承方法(参见下面的__init__ 方法示例),同时让其子级仍然使用父母版本。
我知道我可以通过在GrandChild 类中重新定义__init__ 方法或使用多重继承来实现所需的行为。但是,我的问题旨在通过仅更改 Child 类及其 __init__ 实现来实现相同目的。
(实际用例是明显更复杂的“遗留代码”,每个级别都有几个类。因此,这个问题的动机是在各个类中实现所需的行为,而不必触及其他类的实现或继承结构)
如果这是不可能的,我也希望能对此做出解释。
class Parent:
def __init__(self, a,b):
self.a = a
self.b = b
def __str__(self):
return f"{self.a}, {self.b}"
class Child(Parent):
# I would like to overwrite this method only for the Child Class and none of its children / downstream inhertiances
def __init__(self, a):
super().__init__(a, None)
class GrandChild(Child):
# This Class should use the __init__ method of class Parent
pass
parent = Parent("a","b")
child = Child("c")
# This throws a Type error right now since it calls the init method of class Child
grandchild = GrandChild("d", "e")
编辑:
如上所述,我知道我可以通过不同的方式实现所需的行为,例如更改类结构(如下所示)。然而,问题实际上更多是关于 python 是否允许仅对 Child 类进行更改。如果这在 python 中实际上是不可能的(不仅仅是不受欢迎的),那么解释为什么比提供替代实现来改变任何超出 Child 类的实现的替代实现来回答我的问题。
class ChildCommonFunctionality(Parent):
# Use this class for all common functionality originally provided by Child Class
pass
class Child(ChildCommonFunctionality):
# Use this class to override the init method
def __init__(self, a):
super().__init__(a, None)
class GrandChild(ChildCommonFunctionality):
# This Class should use the __init__ method of class Parent
pass
【问题讨论】:
-
虽然如果您愿意向后弯腰,可能会有解决方案,但这听起来只会引入不必要的混乱和令人惊讶的行为。你究竟需要改变什么行为,也许有不同的方式来实现。
-
看起来这个 Grandchild 类应该是 Parent 类的直接后代。是否真的有必要从 Child 继承某些东西?这不是避免提供答案,而是 OOP 应该是这样的,听起来你试图做一些 OOP 不适合的事情。此外,也许您正在尝试创建一个应该是 Child 的“兄弟”的新课程。
-
所以基本上我有一个现有的继承结构,其中一个类(又名
Child)为其所有子级提供通用功能,但也可以自己实例化。但是,它只需要其子级 (GrandChild) 所需的构造函数参数的一个子集。目前所有类都使用顶级类 (Parent) 的构造函数,这导致在中间实例化类时必须传递不必要的参数 (Child)。我想更改此类的构造函数,同时尽量减少对现有类/继承所做的更改。 -
@madtyn :实际用例/继承树要复杂得多,每个级别上有几个类为其所有子类提供通用功能。如前所述,我正在尝试以上述方式(如果可行的话,这可能不是最干净的方式)来最小化我必须对现有类结构进行的更改。
-
嗨,克里斯,我知道您正在寻找“正常工作”的东西,但通常您想要的东西不仅有效,而且有意义并且对未来的修改具有强大的功能。创建一个只有超类的一部分属性的子类是没有意义的,因为两者之间存在is-a关系。子类应该添加属性和/或修改超类的行为。
标签: python inheritance