刚学Python,还是小白,然后在看简化数据结构时,对代码有一些疑问,想向各位请教

lyw2073327 2020-11-02 07:02:34


(1)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):]:
setattr(self, name, kwargs.pop(name))
。。。。。。
(2) extra_args = kwargs.keys() - self._fields
for name in extra_args:
setattr(self, name, kwargs.pop(name))
。。。。。。
(3)class Stock(Structure):
_fields = ['name', 'shares', 'prices']

s = Stock('ACER', 50, prices = 99, date = '2012-2-2')
print(s.name, s.shares, s.prices, s.date)


为什么感觉 (1) 里面的 if len(args) > len(self._fields) 是指实际的 key 不能比 field 多,那么不就和(2)里面的代码矛盾了吗
(3)里面 _fields = ['name', 'shares', 'prices'],只有3个,但实际s里面还多了一个date的维度,本人不是计算机专业的,完全是刚学,如果问得比较傻还请见谅

...全文
146 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyw2073327 2020-11-04
  • 打赏
  • 举报
回复
@chuifengde 了解了,非常感谢
chuifengde 2020-11-03
  • 打赏
  • 举报
回复
args是位置参数,kwargs才是关键字参数,这个要分清 s = Stock('ACER', 50, prices = 99, date = '2012-2-2') 这一句执行的时候,'ACER'和50是位置参数,被传到args中,而prices=99和date='2012-2-2'被传到kwargs中了,剩下的就好理解了
chuifengde 2020-11-03
  • 打赏
  • 举报
回复
引用 2 楼 lyw2073327 的回复:
哦,好像有点理解了,那么麻烦还想咨询一下,代码中这句extra_args = kwargs.keys() - self._fields,不太明白的是为啥这两个可以相减呢,_fields = ['name', 'shares', 'prices'],那 kwargs.keys() 又是怎么样的形式呢
1.这里的-是集合的差操作 2.单纯的列表或元组或它们与集合都是不能进行集合运算的,也就是只有纯集合才能差,并,交,对称差运算 3.但.keys(),.items()返回的是键视图和键值对视图类型,它们都具有唯一值且可哈希,继承了集合运算,且与列表,元组可混合集合运算,类似于float与int混合时结果是float一个性质
欢乐的小猪 2020-11-03
  • 打赏
  • 举报
回复
https://blog.csdn.net/hbu_pig/article/details/80268608
lyw2073327 2020-11-03
  • 打赏
  • 举报
回复
好的,那我就明白意思了,非常感谢,我的例子是引用的这里的,倒是可以跑起来没报错,https://www.tinymind.net.cn/articles/eba355d62af563
crifan 2020-11-03
  • 打赏
  • 举报
回复
思路:对于不清楚的变量,去打印其类型和值
此处即:

print("kwargs.keys()=%s" % kwargs.keys())
print("type(kwargs.keys())=%s" % type(kwargs.keys()))
print("self._fields=%s" % self._fields)
print("type(self._fields)=%s" % type(self._fields))

即可看出具体是,什么类型,值是多少

然后看起来你这里的逻辑是:
2个list相减,得到多出的key

但是我单独去测试了代码:

>>> list1= ['a', 'b', 'c']
>>> list2 = ['a', 'b']
>>> list3 = list1 - list2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'list' and 'list'
>>> print(type(list1))
<class 'list'>
>>> print(type(list2))
<class 'list'>

-》看起来,python不支持 list直接相减?
所以很疑惑,你的代码能否正常跑通?
lyw2073327 2020-11-03
  • 打赏
  • 举报
回复
哦,好像有点理解了,那么麻烦还想咨询一下,代码中这句extra_args = kwargs.keys() - self._fields,不太明白的是为啥这两个可以相减呢,_fields = ['name', 'shares', 'prices'],那 kwargs.keys() 又是怎么样的形式呢

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧