Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重写类的部分组件的正确方法是什么?_Python_Oop_Coding Style - Fatal编程技术网

Python 重写类的部分组件的正确方法是什么?

Python 重写类的部分组件的正确方法是什么?,python,oop,coding-style,Python,Oop,Coding Style,我有一个manager类,它有几十个“worker”类作为成员,大多数worker类都是在manager类的构造函数中创建的: class Mgr(object): def __init__(self): self.a = A() self.b = B() self.c = C() ... self.z = Z() def execute(self): ... 有时,我想更改一个或多

我有一个manager类,它有几十个“worker”类作为成员,大多数worker类都是在manager类的构造函数中创建的:

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 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


正确的方法是什么?在面向对象和性能方面。任何想法都很感激

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

如果您只想更改
Mgr
的每个实例的几个成员类,我只想将变量传递给
Mgr
构造函数来初始化它们:

类管理器(对象):
定义初始化(self,aBool=False,bBool=False,cBool=False,…,zBool=False):
self.a=A1()如果aBool else a()
self.b=B1()如果bBool else b()
self.c=B1()如果cBool else c()
...
self.z=Z1()如果zBool else z()
这样,如果您想使用所有标准成员类(例如,
E
T
除外)创建一个
Mgr
实例,只需调用

mgr=mgr(eBool=True,tBool=True)
如果每个成员都有两个以上的可能类(因此不仅仅是
A
A1
,还可能有一些
A2
),那么您可以在此基础上创建一个变体,并传入布尔值以外的内容(如本答案注释中所述),尽管构造函数可能会变得更丑陋


这一切仍然要求您列出在创建
Mgr
实例时要对成员类所做的更改,但至少您能够对其进行压缩,而不是为每个更改的成员调用一行代码(这也解决了您的性能问题,因为只有
A
A1
将被创建)

为了组织起见,我建议坚持使用一个
Mgr
类,而不是使用不同的变体

如果您只想更改
Mgr
的每个实例的几个成员类,我只想将变量传递给
Mgr
构造函数来初始化它们:

类管理器(对象):
定义初始化(self,aBool=False,bBool=False,cBool=False,…,zBool=False):
self.a=A1()如果aBool else a()
self.b=B1()如果bBool else b()
self.c=B1()如果cBool else c()
...
self.z=Z1()如果zBool else z()
这样,如果您想使用所有标准成员类(例如,
E
T
除外)创建一个
Mgr
实例,只需调用

mgr=mgr(eBool=True,tBool=True)
如果每个成员都有两个以上的可能类(因此不仅仅是
A
A1
,还可能有一些
A2
),那么您可以在此基础上创建一个变体,并传入布尔值以外的内容(如本答案注释中所述),尽管构造函数可能会变得更丑陋


这一切仍然要求您列出在创建
Mgr
实例时要对成员类所做的更改,但至少您能够对其进行压缩,而不是为每个更改的成员调用一行代码(这也解决了您的性能问题,因为只有
A
A1
将被创建)

好主意!使用类类型而不是布尔值怎么样?例如,mgr=mgr(e=E1,t=T1)和类mgr(object):def u init_uuu(self,acl=False,bCls=False,…):self.A=acl()如果acl是A()这是可行的,尽管我不确定python希望您如何将
acl
等从
False
更改为某些类定义……我要说的是,将默认值设置为
aCls=A
bCls=B
,等等。还请记住,构造函数输入参数名称必须一致(因此,如果构造函数是
\u init__(self,acl…
您不能调用
Mgr(a=A1)
,您必须调用
Mgr(aCls=A1)
。好主意!使用类类型而不是布尔值怎么样?例如,Mgr=Mgr(e=E1,t=T1)和类Mgr(object):def\uu init\uu(self,acl=False,bCls=False,…):self.a=acl(),如果acl是a()这是可行的,尽管我不确定python希望您如何将
acl
等从
False
更改为某些类定义……我要说的是,将默认值设置为
aCls=A
bCls=B
,等等。还请记住,构造函数输入参数名称必须一致(因此,如果构造函数是
\u init__(self,acl…
您不能调用
Mgr(a=A1)
,您必须调用
Mgr(aCls=A1)