gpt4 book ai didi

Python:在基类的方法中初始化一个新的派生类

转载 作者:行者123 更新时间:2023-12-05 07:50:38 26 4
gpt4 key购买 nike

我的情况是我可以访问两个可以很好地协同工作的类。大量修改他们的代码可能是不可能的,但也许可以实现小的更改。但是,我想对这两个类进行一些小的扩展。这似乎是一项子类化、从每个类派生并添加功能的工作。但是我遇到了一个问题,因为一个基类调用了另一个基类,而不是我的派生类。

假设我在模块“base_classes.py”中有两个类 A 和 B。 B 类有一个创建 A 类实例并使用它的方法,例如

'base_classes.py'

class A():
def __init__(self):
print('Class A being called')

class B():
def __init__(self):
self.do_thing()
def do_thing(self):
self.myA = A() # Here class A is explicitly named

所以我想将这两个子类化并扩展它们。我在一个单独的模块中这样做:

'扩展.py'

import base_classes

class DerivedA(base_classes.A):
def __init__(self):
super().__init__()
print('Class DerivedA being called')

class DerivedB(base_classes.B):
pass

db = DerivedB()

正如预期的那样,输出很简单

Class A being called  

但是我怎样才能防止 B 的子类do_thing(self) 方法中创建 A 的基类的实例,而是创建 DerivedA 的实例?

简单的方法是覆盖 DerivedB 中的 do_thing(self) 以便它显式调用 DerivedA,例如

class DerivedB(base_classes.B):
def do_thing(self):
self.myA = DerivedA() # Here class DerivedA is explicitly named

这对于这个小示例来说很好,但是如果 do_thing(self) 有一百行长并且包含许多类型 A 的对象怎么办?如果 B 中的大多数方法都包含一些 A 对象会怎样。您必须基本上使用几乎完全相同的副本覆盖每个方法,这使得首先从 B 派生毫无意义。这几乎就是我的问题,我认为必须有一种聪明的 pythonic 方法来解决这个问题。理想情况下无需完全重写原始类。

有什么想法吗?

最佳答案

您可以更改类 B 上的 do_thing 方法并在参数中传递一个类:

class B():
def __init__(self):
self.do_thing()
def do_thing(self, klass=A):
self.myA = klass()

然后derivedB的do_thing方法可以用DerivedA调用它

class DerivedB(base_classes.B):
def do_thing(self, klass=DerivedA):
return super(DerivedB, self).do_thing(klass)

关于Python:在基类的方法中初始化一个新的派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35985310/

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