覆盖 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
实例,除了 E
和 T
,你打电话
mgr = Mgr(eBool=True, tBool=True)
如果每个成员有两个以上可能的 class(因此不仅仅是 A
和 A1
,您可能还有一些 A2
),然后你可以用传入的布尔值以外的东西创建一个变体(正如这个答案的评论中所讨论的),尽管构造函数可能会变得更丑陋
这仍然需要您在创建 Mgr
实例时列出要对成员 classes 进行的更改,但至少您可以压缩它为每个更改的成员调用一行代码(这也解决了您的性能问题,因为只会创建 A
或 A1
)
我有一个管理器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
实例,除了 E
和 T
,你打电话
mgr = Mgr(eBool=True, tBool=True)
如果每个成员有两个以上可能的 class(因此不仅仅是 A
和 A1
,您可能还有一些 A2
),然后你可以用传入的布尔值以外的东西创建一个变体(正如这个答案的评论中所讨论的),尽管构造函数可能会变得更丑陋
这仍然需要您在创建 Mgr
实例时列出要对成员 classes 进行的更改,但至少您可以压缩它为每个更改的成员调用一行代码(这也解决了您的性能问题,因为只会创建 A
或 A1
)