覆盖 class 的部分组件的正确方法是什么?

What is proper way for overriding part of components of a class?

我有一个管理器class,它有几十个'worker' classes作为成员,大多数工人classes是在管理器[=的构造函数中创建的29=]:

class Mgr(object):
    def __init__(self):
        self.a = A()
        self.b = B()
        self.c = C()
        ...
        self.z = Z()
    def execute(self):
        ...

有时,我想更改一个或多个组件,例如self.b = B1()... 其中 B1 与 B 具有相同的接口。我可以在调用方这样做:

mgr = Mgr()
mgr.b = B1()
mgr.e = E1()
...
mgr.execute()

这不好,因为每次我需要在调用 class 时列出更改。

另一个选项:

class Mgr(object):
    def __init__(self):
        self.a = A()
        self.b = B()
        self.c = C()
        ...
        self.z = Z()
        self.custom()
    def custom(self): pass

class Mgr1(Mgr):
    def custom(self):
        self.b = B1()
        self.e = E1()
        ...

class Mgr2(Mgr):
    def custom(self):
        self.b = B2()
        self.f = F1()
        ...

这样,self.b就被无用的初始化为B(),从性能上来说不太好。而且我们不能将自定义函数移动到构造函数的顶部,因为创建 A、B、C 有一些顺序规则 ...

正确的做法是什么?在 OOP 和性能方面。任何想法表示赞赏!

为了组织起见,我会说坚持使用一个 Mgr class 而不是不同的变体。

如果您只想为 Mgr 的每个实例更改一些成员 classes,我只需将变量传递给 Mgr 构造函数即可初始化它们:

class Mgr(object):
    def __init__(self, aBool = False, bBool = False, cBool = False, ..., zBool = False):
        self.a = A1() if aBool else A()
        self.b = B1() if bBool else B()
        self.c = B1() if cBool else C()
        ...
        self.z = Z1() if zBool else Z()

这样,如果你想创建一个包含所有标准成员 class 的 Mgr 实例,除了 ET,你打电话

mgr = Mgr(eBool=True, tBool=True)

如果每个成员有两个以上可能的 class(因此不仅仅是 AA1,您可能还有一些 A2),然后你可以用传入的布尔值以外的东西创建一个变体(正如这个答案的评论中所讨论的),尽管构造函数可能会变得更丑陋

这仍然需要您在创建 Mgr 实例时列出要对成员 classes 进行的更改,但至少您可以压缩它为每个更改的成员调用一行代码(这也解决了您的性能问题,因为只会创建 AA1