4

いくつかのパラメーターを持つクラスを定義しているときはいつでも、私は自分がこのようなことをしていることに気付くことがよくあります

class myClass(object):
    def __init__(self,param1,param2,param3, ...):
         self.param1 = param1
         self.param2 = param2
         self.param3 = param3
 ...

私の質問は、これを行うためのよりスマートで Pythonier な方法はありますか?

ありがとう、アレックス。

4

3 に答える 3

9

次のように、可変数の名前付き引数を受け入れて、それらを自動的に設定できます。

class MyClass(object):
    def __init__(self, **kwargs): # variable named arguments
        for k, v in kwargs.items():
           setattr(self, k, v) # set the value of self.k to v, same as self.k = v


test = MyClass(param1="param1", param2="param2")
print test.param1 # "param1"

setattr ドキュメント

于 2012-11-21T13:58:45.553 に答える
3

パラメータをkeyword arguments:-として渡すことができます

def __init__(self, **kwargs):
     self.args = kwargs

次に、次のようにクラスをインスタンス化します。-

myClassObj = MyClass(a=12, b="abc") 

次に、argsdictにこれらの引数がキーと値のペアとして含まれます。

{'a':12, 'b':'abc'}

属性にアクセスするには:-

myClassObj.args['a']
myClassObj.args['b']

さまざまな引数の組み合わせを渡すこともできます。どの関数でも4種類の引数を持つことができます:-

  • 位置論
  • デフォルトの引数
  • 非キーワード引数
  • キーワード引数。

その順序でのみ。したがって、関数宣言の一般的な構文は次のとおりです。

def func(positional_arg, default_arg, *nkwargs, **kwargs)

関数の定義の詳細については、ドキュメントを参照してください。

于 2012-11-21T13:54:46.950 に答える
0

あなたは次のようなことをすることができます:

def __init__(self,*args):
   _init_args = ('param1','param2','param3')
   if len(_init_args) != len(args):
      raise TypeError('__init__ takes {nargs} args'.format(nargs=len(_init_args)))
   for k,v in zip(_init_args,*args):
      setattr(self,k,v)

しかし、これが元のソリューションやによって投稿されたソリューションよりもはるかに優れているとは思いませんsean。の答えに対するこれの利点はsean、ユーザーがクラスの属性の名前を知る必要がないことです。宣言された関数のように動作します。

def __init__(self,arg1,arg2,arg3):
    ...

まだ違いはありますが。

于 2012-11-21T14:08:32.607 に答える