上篇文章的__init__()函数已经很灵活了,但是不支持添加额外的属性,什么是额外的属性呢?就是没有定义在_fields域中的属性,我们使用关键字参数来给类添加额外的属性,试试吧。
class Structure: _fields = [] def __init__(self, *args, **kwargs): if len(args) > len(self._fields): raise TypeError('Expected {} arguments'.format(len(self._fields))) for name, value in zip(self._fields, args): setattr(self, name, value) for name in self._fields[len(args): len(self._fields)+1]: setattr(self, name, kwargs.pop(name)) extra_args = kwargs.keys() - self._fields for name in extra_args: setattr(self, name, kwargs.pop(name)) if kwargs: raise TypeError(" Duplicate argument(s): {}".format(','.join(kwargs)))
if __name__ == '__main__': class Stock(Structure): _fields = ['name', 'shares', 'price'] stock1 = Stock('ACNE', 50, 95.2) stock2 = Stock('ACNE', 50, price=95.2) stock3 = Stock('ACNE', shares=50, price=95.2) stock4 = Stock('ACNE', shares=50, price=95.2, date='6/10/2019')
看到没,添加了额外的属性date='6/10/2019',没有报任何哦。
好的,我是袁程序,请大家关注我,谢谢!