python - 在Python中的方法调用中选择设置一些类属性的便捷方法

标签 python class optional-parameters syntactic-sugar

我主要使用 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/

相关文章:

java - 无法弄清楚当玩家得到 5 分时如何让游戏停止。

python - 多参数函数 - *args/**kwargs 的正确用法

c# - 当涉及到带有大量可选参数的函数时,约定是什么?

python - texmate 和 django,有智能感知吗?

python - 在 sphinx 中包含特定的特殊方法

python - R lapply 在多列上与 Python 等效吗?

Python,Django,在类内部使用 Import,似乎无法解决这个问题

java - 如何在没有属性类的情况下拥有相同的程序,这里是 int 私有(private)计数器

dictionary - 在 Dart 中使用 ifAbsent 映射更新方法

python - moviepy subclip 函数中的名称错误