Python - 在 class 初始化中接受额外的关键字参数
Python - Accepting extra keyword arguments in class initialization
class Foo:
def __init__(self, id: int, username: str):
self.id = id
self.username = username
dict = {'id':1,'username':'bar', 'extra':0}
x = Foo(**dict) # Foo.__init__() got an unexpected keyword argument 'extra'
我正在使用一些 Web 服务,这些服务有时会在响应中包含我不关心的额外数据。上面的简化示例说明了这个问题。有没有一种方法可以使用字典来初始化对象,而无需手动输入每个所需的键作为参数?
与其试图以某种方式忽略无关参数,不如采取更灵活的方法,接受 所有 参数,而不管它们呈现给 class构造函数。
然后声明属性(getter 和 setter)以随后访问这些值。
例如:
class Foo:
def __init__(self, **kwargs):
self.kwargs = kwargs
@property
def username(self):
return self.kwargs.get('username')
@username.setter
def username(self, value):
self.kwargs['username'] = value
@property
def ident(self):
return self.kwargs.get('ident')
@ident.setter
def ident(self, value):
self.kwargs['ident'] = value
def __repr__(self):
return ', '.join(f'{k}={v}' for k, v in self.kwargs.items())
f = Foo(ident=123)
print(f.ident)
print(f.username)
f.username = 'Lancelot'
print(f.username)
print(f)
输出:
123
None
Lancelot
ident=123, username=Lancelot
我能想到的唯一缺点(可能还有其他缺点)是您无法区分未传递给构造函数的值和值为 [=27= 的值].你需要让你的吸气剂更精致才能处理这个问题
class Foo:
def __init__(self, id: int, username: str):
self.id = id
self.username = username
dict = {'id':1,'username':'bar', 'extra':0}
x = Foo(**dict) # Foo.__init__() got an unexpected keyword argument 'extra'
我正在使用一些 Web 服务,这些服务有时会在响应中包含我不关心的额外数据。上面的简化示例说明了这个问题。有没有一种方法可以使用字典来初始化对象,而无需手动输入每个所需的键作为参数?
与其试图以某种方式忽略无关参数,不如采取更灵活的方法,接受 所有 参数,而不管它们呈现给 class构造函数。
然后声明属性(getter 和 setter)以随后访问这些值。
例如:
class Foo:
def __init__(self, **kwargs):
self.kwargs = kwargs
@property
def username(self):
return self.kwargs.get('username')
@username.setter
def username(self, value):
self.kwargs['username'] = value
@property
def ident(self):
return self.kwargs.get('ident')
@ident.setter
def ident(self, value):
self.kwargs['ident'] = value
def __repr__(self):
return ', '.join(f'{k}={v}' for k, v in self.kwargs.items())
f = Foo(ident=123)
print(f.ident)
print(f.username)
f.username = 'Lancelot'
print(f.username)
print(f)
输出:
123
None
Lancelot
ident=123, username=Lancelot
我能想到的唯一缺点(可能还有其他缺点)是您无法区分未传递给构造函数的值和值为 [=27= 的值].你需要让你的吸气剂更精致才能处理这个问题