繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM