Python中的属性读取器

Python中的属性读取器,python,ruby,Python,Ruby,python中是否有一个“同义词”表示attr\u 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... 只需一行代码,就可以使se

python中是否有一个“同义词”表示
attr\u 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等类似ruby的
attr\u阅读器
的功能

@foo = foo

您可以使用kwargs执行此操作:

class Foo():
  def __init__(self, **kwargs):
    self.foo = kwargs['foo']
然后传入命名参数:

foo = Foo(foo='bar')

当然,您可能希望捕获KeyError异常要设置所有内容,请尝试:

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)

您可以使用setattr从名为args的关键字设置self attr

>>> 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!!'

可以使用
locals()
,完全使用位置参数完成您想要做的事情:

(我更改了arglist中的两个
spam
s,因为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

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