考虑一个由容器实例组成的结构,其中包含不同的类实例,该结构应在内部实例化,应通过配置文件进行配置,例如。以词典的形式。分配所有参数的Pythonic方法是什么?
我可以想到以下两个选项。哪个是更多的Pythonic,为什么?哪种通用方法是最柔软的,为什么?
选项1a,我当前的方法。每个包含的实例都有Kwargs:
# hundred parameters
params = {'A_param_1':0,'B_param_1':0,...}
class Container():
def __init__(self,params):
self.InstanceA = self.ClassA(**params)
self.InstanceB = self.ClassB(**params)
...
self.InstanceF = self.ClassF(**params)
class ClassA():
def __init__(self,
A_param_1=0,
...
A_param_16=0.123,
**kwargs)
# set param values to self.
self._A_param_1 = A_param_1
选项1B,相同但没有**参数的详细信息:
class Container():
def __init__(self,params):
self.InstanceA = self.ClassA(all written out.. )
self.InstanceB = self.ClassB(all written out.. )
...
self.InstanceF = self.ClassF(all written out.. )
选项2-同事的方法。每个包含的实例在没有Kwargs的情况下进行:
# hundred parameters
params = {'A_param_1':0,'B_param_1':0,...}
class Container():
def __init__(self,params):
self.InstanceA = self.ClassA(params)
self.InstanceB = self.ClassB(params)
...
self.InstanceF = self.ClassF(params)
class ClassA():
def __init__(self,
params
)
# set param values to self.
self._A_param_1 = self.params['A_param_1']
PROS选项1A:每个构造函数都有默认的夸尔格人,从字面上明确说明了这些夸大的性质。
cons选项1a:一个人不知道是使用默认值还是通过**参数给出的值。**参数列出了所有参数,而不仅仅是特定实例的参数。
PROS选项2:如果未提供特定参数,则每个实例都以键盘的明确方式抓住其所需的东西。
cons选项2:必须在docstring或评论中明确说明参数的典型值。
选项1b似乎将选项1a和选项2的口味结合在一起,并在构造函数调用中明确解开**参数的额外难度。
重复我的问题:一般而言,什么是pythonic方法的方法是什么?
ps:我希望我让自己理解,并在某种程度上使用正确的术语来表达自己。如果没有,请告诉我。
我不喜欢将所有参数传递给每个构造函数。我将使用这样的嵌套词典的配置,可能存储在JSON文件中:
# hundred parameters
params = {'A': {'A_param_1': 0, ..., 'A_param_16': 1},
'B': {'B_param_1': 0, ...},
...
'F': {'F_param_1': 0, ...}}
class Container():
def __init__(self, params):
self.InstanceA = ClassA(**params['A'])
self.InstanceB = ClassB(**params['B'])
...
self.InstanceF = ClassF(**params['C'])
class ClassA:
def __init__(self,
A_param_1=0,
...
A_param_16=0.123):
# set param values to self.
self._A_param_1 = A_param_1
我可能还会通过计算类似的类名称和实例名称来自动化容器初始化器:
class ClassF:
def __init__(self, foo):
self.foo = foo
def main():
c = 'F'
n = 23
cls = globals()['Class' + c]
o = cls(n)
print(o.foo) # => 23
main()
您可以将setattr()
用于self.InstanceA
。