在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
?
在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
?
一个问题
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')
一个成语我所看到的是self.__dict__.update(locals())
如果你正好在方法开始运行,这将在更新对象的论据词典(因为只有这些当地人在方法的开始)。 如果您在传递**kwargs
你可以做self.__dict__.update(**kwargs)
当然,这是一个脆弱的方法。 这可能会导致令人费解的错误,如果你不小心在争论掩盖现有的属性传递。 举例来说,如果你的类有一个.doSomething()
方法和你不小心通过doSomething=1
到构造函数,它将覆盖的方法和导致错误后,如果您尝试调用该方法。 出于这个原因,最好不要这样做,除了在某些微不足道的情况下(例如,某种代理对象,其唯一目的是充当一个“包”拿着几个属性的)。
是:
class SomeClass:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)