假设我有一个带有构造函数(或其他函数)的类,该类接受可变数量的参数,然后有条件地将其设置为类属性。
我可以手动设置它们,但似乎变量参数在python中足够普遍,因此应该有一个共同的习惯用法。 但是我不确定如何动态地执行此操作。
我有一个使用eval的示例,但这并不安全。 我想知道正确的方法-也许用lambda吗?
class Foo:
def setAllManually(self, a=None, b=None, c=None):
if a!=None:
self.a = a
if b!=None:
self.b = b
if c!=None:
self.c = c
def setAllWithEval(self, **kwargs):
for key in **kwargs:
if kwargs[param] != None
eval("self." + key +"=" + kwargs[param])
看起来这些问题很相似:stackoverflow.com/questions/3884612/ stackoverflow.com/questions/356718/ stackoverflow.com/questions/1446555/因此,我想要的可能是这个-self .__ dict __ [key] = kwargs [key]
与您的问题并不完全相关,但是您可能需要检查PEP8,以获取有关常规Python样式的一些提示。
有一个很棒的图书馆,叫做attrs。 只需pip install attrs,用@attr.s装饰您的类,并将args设置为a = attr.ib(); b = attr.ib(),等等。
我在这里想念什么吗? 您仍然需要做self.x = kwargs.getx]。您可以接受来自呼叫者的错别字。您必须创建带有额外字符的客户端instance = Class(** {}),如果您不愿意通过self.x = 平淡无奇,反正以后还会咬你吗? 即,您将最终以self .__ dict __ [x]代替self.x,对吗? 或getattr()键入多于self。
您可以使用setattr()方法:
class Foo:
def setAllWithKwArgs(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
有一个类似的getattr()方法来检索属性。
@larsks谢谢,但是知道我们如何仅能解开字典键吗? stackoverflow.com/questions/41792761/
您需要使用.getattr()吗?还是可以使用Foo.key访问属性?
@StevenVascellaro您当然可以