5

在 python 中是否有“同义词” attr_reader,比如不需要让我输入的东西?:

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.,有点像红宝石的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 args:

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

你可以用 kwargs 做到这一点:

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

然后你传入命名参数:

foo = Foo(foo='bar')

当然,你可能想捕捉 KeyError 异常

于 2012-04-09T15:52:49.677 回答
1

您可以使用 setattr 从名为 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 回答
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

(我在 arglist 中更改了您的两个spams,因为 Python 不喜欢有多个具有相同名称的参数。)

请注意,所有本地人都将成为实例上的属性。如果您想静态初始化一堆属性,这会很方便,因为您不需要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 回答