[英]Python: Initialising a new derived class in a method of a base class
我的情况是我可以访问两个可以很好地协同工作的类。 大规模修改其代码可能是不可能的,但也许可以实现一些小的更改。 但是,我想对这两个类进行一些小的扩展。 从每个类派生并添加功能,这似乎是子类化的工作。 但是我遇到了一个问题,因为一个基类调用了另一个基类,而不是我的派生类。
假设我在模块“ 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
因此,我想对这两个子类进行继承并扩展它们。 我在一个单独的模块中执行此操作:
'extensions.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()
然后generateB do_thing
方法可以用DerivedA调用它
class DerivedB(base_classes.B):
def do_thing(self, klass=DerivedA):
return super(DerivedB, self).do_thing(klass)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.