我有一个类 _ init _ 函数需要很多关键字参数。我希望能够基本上重写这段代码,以便它在语法上更清晰(编程更少)。我希望能够得到它,只需在 _ init _ 中添加关键字参数,就可以分别更改null函数中的所有属性/参数。
class Class :
def __init__ (self, kw0=0, kw1=1, kw2=2) :
''' The keyword arguments as strings. '''
self.Keys = ['kw0', 'kw1', 'kw2']
''' Their values. '''
self.Values = [kw0, kw1, kw2]
''' A dictionary made from the keys and values. '''
self.Dict = self.make_dict()
''' As individual attributes, '''
self.KW0, self.KW1, self.KW2 = self.Values
def make_dict (self) :
''' Makes a dictionary '''
keys = self.Keys
values = self.Values
_dict = {}
for i in xrange(len(keys)) :
key = keys[i]
value = values[i]
_dict[key] = value
return _dict
def null (self, kw0=None, kw1=None, kw2=None) :
''' The same keyword arguments as **__init__** but they all default
to **None**. '''
pass
c = Class()
print c.Keys
print c.Values
print c.Dict
print c.KW0
print c.KW1
print c.KW2
答案 0 :(得分:3)
这是我喜欢python的一件事。在__init__
def __init__ (self, **kwargs):
self.__dict__.update(kwargs)
将附加在字典kwargs
中的成员作为该类的成员。
EDITED - 反映** kwargs和update()的正确语法,而不是append()
答案 1 :(得分:2)
为什么不接受任何关键字参数。您可以将class属性用于允许的关键字名称及其默认值。
class Class(object):
_defaults = dict(kw0=42, kw1=None, kw2=True, kw3="Ni!")
def __init__(self, **kwargs):
# Raise exception if any non-supported keywords supplied
if set(kwargs.keys()) - set(self._defaults.keys()):
raise KeyError("unsupported keyword argument")
# Update our instance with defaults, then keyword args
self.__dict__.update(self._defaults)
self.__dict__.update(kwargs)
如果你想在多个方法中使用相同的功能(例如__init__()
和null()
),那么只需将参数处理代码分解为自己的方法并从两个地方调用它。
一个缺点是help()
和其他Python文档工具不会显示允许的关键字参数,因为它们不在您的方法签名中。
顺便说一句,我不太清楚你为什么要单独存储密钥和值。只需将它们存储为字典,然后使用字典.keys()
或.values()
方法获取键或值。