我最近开始在 __init__()
中使用 **kwargs
来初始化一个对象,因为在添加另一个属性时我不必对该函数进行任何更新。我只是将它们作为参数传递,然后循环完成工作。
class Customer(Base):
"""Model that defines a customer entity"""
__tablename__ = "customers"
date_created = Column(DateTime)
date_modified = Column(DateTime)
def __init__(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
但是,根据您的经验,这样做是否存在安全问题?与下面明确定义将要初始化的内容的代码相比,我们是否会遇到不需要的副作用?
class Customer(Base):
"""Model that defines a customer entity"""
__tablename__ = "customers"
date_created = Column(DateTime)
date_modified = Column(DateTime)
def __init__(self, attrs):
self.date_created = attrs.get("date_created")
self.date_modified = attrs.get("date_modified")
最佳答案
这是否符合“不需要的副作用”的条件?
class Foo(object):
def __init__(self, name, **kw):
self.name = name
for k, v in kw.items():
setattr(self, k, v)
f = Foo("Bob", __dict__={"aaa":1, "bbb":2, "name":"HEHEHE"})
f.name
>>> 'HEHEHE'
或者为了更有趣:
class Bar(object):
pass
f = Foo("Bob", __dict__={"aaa":1, "bbb":2, "name":"HEHEHE"}, __class__=Bar)
type(f)
>>> <class '__main__.Bar'>
现在,只要只有受信任的代码实例化您的类,这里就没有真正的安全问题——所有这些实际上也可以在初始化程序之外完成。但是,明确说明代码的可读性更高,并且有助于发现一些拼写错误。
关于python - 使用 **kwargs 初始化类是否存在安全问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45817377/