python中的自我语法

时间:2012-11-21 13:53:20

标签: python class oop

每当我定义一个具有许多参数的类时,我经常会发现自己在做这样的事情

class myClass(object):
    def __init__(self,param1,param2,param3, ...):
         self.param1 = param1
         self.param2 = param2
         self.param3 = param3
 ...

我的问题是:有没有更聪明的Pythonier方法呢?

谢谢, 亚历克斯。

3 个答案:

答案 0 :(得分:9)

您可以接受可变数量的命名参数并自动设置它们,如下所示:

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"

setattr documentation

答案 1 :(得分:3)

您可以将参数作为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)

有关定义函数的更多信息,请参阅documentation

答案 2 :(得分:0)

您可以执行以下操作:

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发布的解决方案要好得多。这个问题的优点是sean的答案是用户不需要知道你班级中属性的名称是什么。它的行为有点像声明的函数:

def __init__(self,arg1,arg2,arg3):
    ...

虽然仍有差异。