5

attr_reader入力する必要のないもののような、pythonの「同義語」はありますか?:

class Foo():
    def __init__(self, foo, bar, spam, spammity, spam, spam, quux, foobar, barfoo):
        self.foo = foo
        self.bar = bar
        self.spam = spam
        # And so on...

self.foo = foo, etc.ruby がどのようにを作るかのattr_readerように

@foo = foo
4

4 に答える 4

4

すべてを設定するには、次を試してください。

class Foo():
  def __init__(self, **kwargs):
    for k,v in kwargs.items():
        setattr(self, k, v)

または、いくつかの属性のみ:

class Foo():
  def __init__(self, **kwargs):
    for k in ['foo', 'bar', 'spam']:
        setattr(self, k, kwargs[k])

または(いくつかの)ctor引数から:

class Foo():
  def __init__(self, foo, bar, spam, bork, kevork):
    for k in ['foo', 'bar']:
        setattr(self, k, locals()[k])

またはそれらすべて:

class Foo():
  def __init__(self, foo, bar, spam, bork, kevork):
    args = dict(locals())
    for k, v in (k,v for k,v in args.items() if not k == 'self'):
        setattr(self, k, v)
于 2012-04-09T15:55:27.793 に答える
1

あなたがしたいことは、以下を使用して位置引数で完全に行うことができますlocals():

class Foo():
   def __init__(self, foo, bar, spam, spammity, spaam, 
                spamm, quux, foobar, barfoo):
       self.__dict__.update(locals())

f = Foo(1, 2, 3, 4, 5, 6, 7, 8, 9)
print f.spamm   # 6

( spamPython は同じ名前の複数の引数を持つことを好まないため、arglist の 2 つを変更しました。)

すべてのローカルがインスタンスの属性になることに注意してください。selfこれは、一連の属性を静的に初期化する場合に便利です。属性の前に入力する必要がないためです。

class Foo():
   def __init__(self, foo, bar, spam, spammity, spaam, 
                spamm, quux, foobar, barfoo):
       a = b = c = 0
       self.__dict__.update(locals())   # sets a, b, and c too

ただし、キーワード引数を受け入れる場合は、その変数を更新から除外するか、その直後に除外する必要がありますdel self.kwargs

于 2012-04-09T16:19:31.890 に答える
1

これはkwargsで行うことができます:

class Foo():
  def __init__(self, **kwargs):
    self.foo = kwargs['foo']

そして、名前付き引数を渡します:

foo = Foo(foo='bar')

もちろん、KeyError 例外をキャッチすることもできます。

于 2012-04-09T15:52:49.677 に答える
1

You can use setattr to set self attr from keyword named args.

>>> class Foo():
...     def __init__(self, **kwargs):
...         for attr_name in kwargs.keys():
...             setattr(self,attr_name,kwargs[attr_name])
... 
>>> j=Foo(it_works='cool!!')
>>> j.it_works
'cool!!'
于 2012-04-09T15:58:32.143 に答える