0

個々の関数呼び出しの戻り値で埋める必要のある多くの属性を持つクラスオブジェクトに直面しています。残念ながら、属性名は呼び出された関数のパラメーターに1対1でマップされません。この手動マッピングを繰り返し行わずにこれを達成するためのPythonの方法はありますか?

obj = MyClass()
obj.a_min = func(a1xyz, 'min')
obj.a_max = func(a2zzz, 'max')
obj.a_avg = ...
obj.b_min = ...
obj.b_max = ...
...
obj.n_min = ...
...
4

1 に答える 1

0

これが最もPython的な方法であるかどうかはわかりませんが、呼び出したい関数が同じシグネチャを持っている限り機能する1つの代替方法があります。

class A(object) :
    def __init__(self) :
        d = {"arg1" : (1, "arg1_v"),
             "arg2" : (2, "arg2_v")}
        for key, value in d.items() :
            setattr(self, key, f(*value))

a = A()
print a.arg1
print a.arg2

属性名に応じて異なる関数を呼び出したい場合は、関数名を使用することもできます。

def f_arg1(x) :
    return x
def f_arg2(x, y) :
    return (x, y)

class A(object) :
    def __init__(self) :
        d = {"arg1" : ((1,), f_arg1),
             "arg2" : ((2,3), f_arg2)}
        for key, value in d.items() :
            a, f = value
            setattr(self, key, f(*a))

a = A()
print a.arg1
print a.arg2
于 2013-03-20T20:49:29.617 に答える