将函数参数分配给`self` [英] Assign function arguments to `self`
问题描述
我注意到,我使用的常见模式是将SomeClass.__init__()
参数分配给同名的self
属性.示例:
class SomeClass():
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
实际上,它必须是其他人的共同任务,并且 PyDev 为此提供了快捷方式-如果将光标放在参数上列表并单击Ctrl+1
,您将获得Assign parameters to attributes
的选项,该选项将为您创建样板代码./p>
执行此任务是否有不同,简短而优雅的方法?
装饰魔术师!
>>> class SomeClass():
@ArgsToSelf
def __init__(a, b=1, c=2, d=4, e=5):
pass
>>> s=SomeClass(6,b=7,d=8)
>>> print s.a,s.b,s.c,s.d,s.e
6 7 2 8 5
在定义时:
>>> import inspect
>>> def ArgsToSelf(f):
def act(self, *args, **kwargs):
arg_names,_,_,defaults = inspect.getargspec(f)
defaults=list(defaults)
for arg in args:
setattr(self, arg_names.pop(0),arg)
for arg_name,arg in kwargs.iteritems():
setattr(self, arg_name,arg)
defaults.pop(arg_names.index(arg_name))
arg_names.remove(arg_name)
for arg_name,arg in zip(arg_names,defaults):
setattr(self, arg_name,arg)
return f(*args, **kwargs)
return act
当然,您可以定义一次该装饰器,并在整个项目中使用它.
此外,该装饰器可用于任何对象函数,而不仅限于__init__
.
I've noticed that a common pattern I use is to assign SomeClass.__init__()
arguments to self
attributes of the same name. Example:
class SomeClass():
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
In fact it must be a common task for others as well as PyDev has a shortcut for this - if you place the cursor on the parameter list and click Ctrl+1
you're given the option to Assign parameters to attributes
which will create that boilerplate code for you.
Is there a different, short and elegant way to perform this assignment?
Decorator magic!!
>>> class SomeClass():
@ArgsToSelf
def __init__(a, b=1, c=2, d=4, e=5):
pass
>>> s=SomeClass(6,b=7,d=8)
>>> print s.a,s.b,s.c,s.d,s.e
6 7 2 8 5
while defining:
>>> import inspect
>>> def ArgsToSelf(f):
def act(self, *args, **kwargs):
arg_names,_,_,defaults = inspect.getargspec(f)
defaults=list(defaults)
for arg in args:
setattr(self, arg_names.pop(0),arg)
for arg_name,arg in kwargs.iteritems():
setattr(self, arg_name,arg)
defaults.pop(arg_names.index(arg_name))
arg_names.remove(arg_name)
for arg_name,arg in zip(arg_names,defaults):
setattr(self, arg_name,arg)
return f(*args, **kwargs)
return act
Of course you could define this decorator once and use it throughout your project.
Also, This decorator works on any object function, not only __init__
.
这篇关于将函数参数分配给`self`的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!