6

Python クラスには、initと呼ばれる初期化メソッドがあります。多くの場合、初期化子は、同名の属性にコピーされるいくつかの引数を受け入れます。

def __init__(self, a, b, c, d):
    self.a = a
    self.b = b
    self.c = c
    self.d = d

これは大変な作業であり、私には「非 Pythonic」に感じられます。プロセスを自動化する方法はありますか?

これらの行(以下の疑似コード)に沿った何かが機能する可能性があると思いました:

for x in __init__.argument_names:
    exec('self.' + x + ' = ' + x)

この方法で exec を呼び出すのは良い習慣ではないことはわかっています。しかし、Python 開発チームは、このタスクを自動化するための安全で同等の方法を作成した可能性があります。

助言がありますか?

FS

4

2 に答える 2

4

inspectモジュールを使用してこれを実現できます(編集:コメントで正しく指摘されているように、実際にはこのモジュールをインポートする必要はありません):

class A:
    def __init__(self, a, b, c, d):
        args = locals().copy()
        del args['self']
        self.__dict__.update(args)

a = A(1,2,3,4)
print a.a
print a.b
print a.c
print a.d

python test.py
1
2
3
4

これをユーティリティ関数にラップすることができcurrentframeますgetouterframes

于 2013-08-17T17:26:42.377 に答える
1

これを行う方法は次のとおりです。

class test:
    def __init__(self, *args):
        names = ['a', 'b', 'c', 'd']
        for name, arg in zip(names, args):
            setattr(self, name, arg)

t = test(5, 6, 7, 8)
print t.a, t.b, t.c, t.d
# 5 6 7 8
于 2013-08-17T17:19:15.760 に答える