每当我定义一个有许多参数的类时,我经常发现自己在做这样的事情
class myClass(object):
def __init__(self,param1,param2,param3, ...):
self.param1 = param1
self.param2 = param2
self.param3 = param3
...
我的问题是:有没有更聪明、更 Python 的方式来做到这一点?
谢谢,亚历克斯。
您可以接受可变数量的命名参数并自动设置它们,如下所示:
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"
您可以将参数作为keyword arguments
: -
def __init__(self, **kwargs):
self.args = kwargs
然后你将像这样实例化你的类: -
myClassObj = MyClass(a=12, b="abc")
然后您的args
dict 将包含这些参数作为键值对:-
{'a':12, 'b':'abc'}
访问属性: -
myClassObj.args['a']
myClassObj.args['b']
您还可以传递各种参数的组合。您可以在任何函数中使用 4 种参数:-
仅按此顺序。所以函数声明的典型语法是:-
def func(positional_arg, default_arg, *nkwargs, **kwargs)
有关定义函数的更多信息,请参阅文档。
您可以执行以下操作:
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
. 这个 oversean
的答案的优点是用户不需要知道你的类中属性的名称是什么。它的行为有点像声明的函数:
def __init__(self,arg1,arg2,arg3):
...
虽然还是有区别的。