我主要使用 python 作为数值模拟的粘合语言。
通常我会创建一些包装类来初始化一些合理的默认参数,并且在较大脚本的其他地方我会调用 run()
方法,该方法可以选择覆盖一些参数并执行实际的模拟。
它可能看起来像这样:
class MyCalculationClass():
def __init__():
# set some defaults
self.A = 45454
self.B = np.zeros(16,11)
self.C = (1.0,2.5,30.0)
def runRaw():
return whatever(self.A,self.B,self.C)
def run( A=None, B=None, C=None ):
# optionally override some defaults
if A is not None:
self.A = A
if B is not None:
self.B = B
if C is not None:
self.C = C
# run the actual calculation
return self.runRaw()
mycalc1 = MyClaculationClass()
# .... Over the Hills and Far Away
mycalc1.run(B=np.zeros(11,12) )
但我真的讨厌样板 if A is not None: self.A = A
无处不在。通常有数十个参数。
这样会好一点
def run( A=self.A, B=self.B, C=self.C ):
# optionally override some defaults
self.A = A
self.B = B
self.C = C
# run the actual calculation
self.runRaw()
但是:
- 它不起作用
- 仍然是太多的样板
注意:我真的希望 self.A 等继续存储为类属性,以便能够恢复我稍后在较大脚本中的计算中使用的参数
最佳答案
如果您不介意丢失一些检查提供的 automagic 文档,您可以执行以下操作:
class Foo(object):
def __init__(self):
self._set(A=42, B=[], C="something")
def _set(self, **kw):
for name, val in kw.items():
if val is not None:
setattr(self, name, val)
def run(self, **kw):
self._set(**kw)
self.runRaw()
如果您想保持 run()
签名完整,这是可能的,但不会那么通用(因为 run()
必须知道它的参数):
def run(self, A=None, B=None, C=None):
self._set(A=A, B=B, C=C)
self.runRaw()
另请注意,可以通过声明 __call__
方法使 Python 对象可调用:
class NotAFunc(object):
def __call__(self, arg):
print("{} called with {}".format(self, arg))
f = NotAFunc()
f(42)
关于python - 在Python中的方法调用中选择设置一些类属性的便捷方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51540966/