python中的自语法

python中的自语法,python,class,oop,Python,Class,Oop,每当我定义一个有许多参数的类时,我经常发现自己在做这样的事情 class myClass(object): def __init__(self,param1,param2,param3, ...): self.param1 = param1 self.param2 = param2 self.param3 = param3 ... 我的问题是:有没有一种更聪明、更像蟒蛇的方法 谢谢, Alex。您可以将参数作为关键字参数进行传递:

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

class myClass(object):
    def __init__(self,param1,param2,param3, ...):
         self.param1 = param1
         self.param2 = param2
         self.param3 = param3
 ...
我的问题是:有没有一种更聪明、更像蟒蛇的方法

谢谢,
Alex。

您可以将参数作为
关键字参数进行传递
:-

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)

有关定义函数的详细信息,请参阅。

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

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"

您可以执行以下操作:

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的回答相比,这种方法的优点是用户不需要知道类中属性的名称。它的行为更像一个声明的函数:

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

尽管仍然存在差异。

那么我以后可以在类中引用self.a和self.b?但这并不能产生预期的结果。只有一个属性
args
,而不是多个属性。@AlexS。。否,
self.args
访问字典。然后访问每个参数:-
self.args['a']
@LevLevitsky。。是的,因为这个属性是一个字典,它可以存储所有这些属性,然后我们可以访问它。请参阅我编辑的帖子。这可能很聪明,但如果您传递的参数超过六个,您的代码可能会变得非常糟糕!在我看来,你所做的是最具可读性和python风格的。例如,只有在特殊情况下,如果有大量属性,我才会使用另一个选项。如果你将六个参数传递给构造函数,并定期将它们复制到属性中,而无需进一步处理,你可能想重温一下你对干净API和良好OOP风格的看法。说实话,我的背景是数值分析和统计物理,所以通常我写一些代码,我想运行多次或访问一些内部工作,但它应该是自包含和可重用的。我不需要使用OO,但我想我也可以学到一些东西。例如,当你有一个热力学系统时,你会得到尺寸、温度、相互作用强度、磁场等等参数。也许用一个类来表示系统及其动力学实际上是个坏主意,它有点复杂,但它确实完成了任务。问题是,我可能每次使用该属性时都要检查它是否已定义。不过,谢谢!由于这是在构造函数中,因此此时对象本身将不具有属性,因此不需要进行检查。您有时会看到的另一件事是
self.\uu dict\uuu.update(kwargs)
。然而,我更喜欢这种方法。