python 变量 fields_如何在python中从变量参数(kwargs)设置类属性

假设我有一个带有构造函数(或其他函数)的类,该类接受可变数量的参数,然后有条件地将其设置为类属性。

我可以手动设置它们,但似乎变量参数在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您当然可以

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python ,__init__ 方法通常用于初始化对象的属性。通常情况下,我们只需要在 __init__ 方法定义一些属性,传递一些参数,然后通过 self.属性名 = 属性值 的方式来初始化属性。但是如果需要初始化的属性超过3个,我们可以考虑以下两种方法: 1. 使用字典或元组传递参数 我们可以将需要初始化的属性组织成一个字典或元组,然后将它们传递给 __init__ 方法。在 __init__ 方法,我们可以通过键值对或索引的方式来获取对应的值,然后进行属性的初始化。 例如: ``` class Person: def __init__(self, **kwargs): self.name = kwargs.get('name') self.age = kwargs.get('age') self.gender = kwargs.get('gender') self.address = kwargs.get('address') ``` 在创建 Person 对象时,我们可以传递多个参数,如: ``` person = Person(name='Tom', age=20, gender='male', address='China') ``` 2. 使用似于**kwargs的方式 我们也可以使用似于 **kwargs 的方式来传递多个参数。在的定义,我们可以使用 *args 和 **kwargs 来接收传递的参数,然后在 __init__ 方法进行属性的初始化。 例如: ``` class Person: def __init__(self, *args, **kwargs): self.name = kwargs.get('name') self.age = kwargs.get('age') self.gender = kwargs.get('gender') self.address = kwargs.get('address') ``` 在创建 Person 对象时,我们也可以传递多个参数,如: ``` person = Person('Tom', 20, gender='male', address='China') ``` 需要注意的是,在使用这种方式时,传递的参数需要按照顺序传递,否则会出现参数不匹配的错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值