Tob*_*ler 6 python constructor class
Python中的构造函数通常如下所示:
class SomeClass:
def __init__(self, a, b = None, c = defC):
self.a = a
self.b = b or []
self.c = c
Run Code Online (Sandbox Code Playgroud)
有没有这样的快捷方式,例如简单地定义__init__(self,**kwargs)
和使用键作为属性self
?
我见过的一个成语是self.__dict__.update(locals())
.如果在方法的开头运行它,这将使用参数更新对象的字典(因为这些是方法开头的唯一本地).如果你传入,**kwargs
你可以做到self.__dict__.update(**kwargs)
.
当然,这是一种脆弱的方法.如果您不小心传入掩盖现有属性的参数,它可能会导致令人费解的错误.例如,如果您的类有一个.doSomething()
方法并且您不小心传递doSomething=1
给构造函数,它将覆盖该方法并在以后尝试调用该方法时导致错误.出于这个原因,最好不要这样做,除非在某些微不足道的情况下(例如,某种代理对象,其唯一目的是作为包含少数属性的"包").
是:
class SomeClass:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
Run Code Online (Sandbox Code Playgroud)
一个问题
self.__dict__.update(locals())
Run Code Online (Sandbox Code Playgroud)
是它包括self
,所以你得到self.self
.过滤self
掉会更好locals()
例如.
vars(self).update((k,v) for k,v in vars().items() if k != 'self')
Run Code Online (Sandbox Code Playgroud)
您可以使用此变体防止意外覆盖方法
vars(self).update((k,v) for k,v in vars().items()
if k != 'self' and k not in vars(self))
Run Code Online (Sandbox Code Playgroud)
如果您不希望它以静默方式失败,您也可以事先检查这样
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')
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2767 次 |
最近记录: |