我正在创建一个Python类,它将使用其参数来定义该类中的另外两个类。例如,ClassA
containsClassB
和ClassC
。因此,ClassA具有许多参数。
我目前正在使用**kwargs
forclassB
和classC
arguments解决此问题,并仅保存参数的输入classA
参数。例如:
class A:
def __init__(self, a1, a2, a3, **kwargs):
self.a1 = a1
self.a2 = a2
self.a3 = a3
# Get B and C kwargs
default_params = {
'b1': kwargs.get('b1', 1),
'b2': kwargs.get('b1', 2),
'c1': kwargs.get('c1', 1),
'c2': kwargs.get('c1', 2),
}
for param in default_params:
self.__dict__[param] = default_params[param]
B = classB(a1=self.a1, b1=self.b1, b2=self.b2)
C = classC(a2=self.a2, c1=self.c1, c2=self.c2)
与下面的方法相比,这是更糟糕的解决方案吗?
class A:
def __init__(
self,
a1, a2, a3,
b1, b2, c1, c2):
self.a1 = a1
self.a2 = a2
self.a3 = a3
self.b1 = b1
self.b2 = b2
self.c1 = c1
self.c2 = c2
我担心的是,如果类B和C的参数过多,那么类A的属性似乎太多了。另一方面,第一种方法似乎仍然占用更多的行。
另一种方法是,如果我仅将kwargs传递给classB
和classC
,但是当其中一个类中不存在某些参数时,这将出现错误。
对于具有许多属性的类并利用这种设计模式,我在这里看不到pythonic的方法吗?
您的主要标准应该是避免模仿Python本身提供的功能-即参数和默认值以及实例属性。
由于__init__
已经知道所有属性和期望的默认值(通过default_params
),因此可以将它们直接添加到签名中。避免存放论据classB
和classC
上A
-如果需要的话,从实例中获取它们。
class A:
# handle parameters/defaults natively
def __init__(self, a1, a2, a3, b1=1, b2=2, c1=1, c2=2):
self.a1 = a1
self.a2 = a2
self.a3 = a3
# do not store B/C attributes, store B/C directly
self.b = classB(a1=self.a1, b1=b1, b2=b2)
self.c = classC(a2=self.a2, c1=c1, c2=c2)
这在功能上等同于第一种情况(减去所有参数),但是使用了本机Python功能。
如果A
必须提供其他功能,请显式添加它们:
如果A
应采用(并忽略)其他参数,则应具有一个附加的包罗万象**kwargs
:
class A:
# discard additional parameters/defaults explicitly
def __init__(self, a1, a2, a3, b1=1, b2=2, c1=1, c2=2, **_):
...
如果A
应公开classB
和/或classC
提供字段,请从实例中提供它们。
class A:
...
@property
def b1(self):
return self.b.b1
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句