在Python类构造函数中是否有“self.somevariable = somevariable”的快捷方式?

时间:2012-08-30 06:29:54

标签: python class constructor

Python中的构造函数通常如下所示:

class SomeClass:
    def __init__(self, a, b = None, c = defC):
        self.a = a
        self.b = b or []
        self.c = c

是否有这样的捷径,例如简单地定义__init__(self,**kwargs)并将密钥用作self的属性?

3 个答案:

答案 0 :(得分:8)

我见过的一个成语是self.__dict__.update(locals())。如果在方法的开头运行它,这将使用参数更新对象的字典(因为这些是方法开头的唯一本地)。如果您传递**kwargs,则可以self.__dict__.update(**kwargs)

当然,这是一种脆弱的方法。如果您不小心传入掩盖现有属性的参数,它可能会导致令人费解的错误。例如,如果您的类具有.doSomething()方法并且您不小心将doSomething=1传递给构造函数,则它将覆盖该方法并在以后尝试调用该方法时导致错误。出于这个原因,最好不要这样做,除非在某些微不足道的情况下(例如,某种代理对象,其唯一目的是作为包含少数属性的“包”)。

答案 1 :(得分:6)

是:

class SomeClass:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

答案 2 :(得分:5)

的一个问题
self.__dict__.update(locals())

它包含self,因此您获得self.self。最好从self

中过滤locals()

例如

vars(self).update((k,v) for k,v in vars().items() if k != 'self')

您可以使用此变体防止意外覆盖方法

vars(self).update((k,v) for k,v in vars().items()
                   if k != 'self' and k not in vars(self))

如果您不希望它以静默方式失败,您也可以事先检查这个

if any(k in vars(self) for k in vars()):
    raise blahblah
vars(self).update((k,v) for k,v in vars().items() if k != 'self')