Discuss / Python / 有个地方很是纠结,大虾们看下:

有个地方很是纠结,大虾们看下:

Topic source

最疑惑的地方是Model类中的save()有句调用代码args.append(getattr(self, k, None)),关键我想知道的是k=v么,关键是v的类型是File啊,它怎么获得的又是string类型的啊,比如Id=StringFile("id"),怎么又Id="12345"了,这个地方让我很是纠结

这是信仰

#2 Created at ... [Delete] [Delete and Lock User]

我找了快一个小时才发现一点:

class Model(dict, metaclass=ModelMetaclass):

这个类首先继承了dict类,所以会先调用dict的构造函数,把attr都写到自己的属性里。

或许对你理解有帮助。

但感觉这个Model就把attr的数据存在了两个字典里,一个是自己,一个是成员mappings;当然,前者元素的值直接是实例化时给的参数,但是后者元素的值是Field 类型。这样做会不会要占据冗余的内存空间呢。

这是信仰

#3 Created at ... [Delete] [Delete and Lock User]

这样设计,可能在扩展这个类时,还会有命名冲突的危险。

wocna

#4 Created at ... [Delete] [Delete and Lock User]

关于Id=StringFile("id"),怎么又Id="12345"了 Id=StringFile("id")是写在class user里的,说白了是写给它的元组爷爷看的,告诉它在建user这个类的时候,要改变一下里面的格式,怎么改?麻烦爷爷你去Fields那里转一圈。 当最后的attrs格式修改完,class user建立了之后,StringFile("id")这个其实就没意义了,历史使命完成了呀。 等到我们输入一个user的实例时,Id="12345"就放在attrs里的正确位置里,等待着有命令来翻它的牌子。比如args这个家伙,就要求它给出K值,返回V值。因为是在实例里,所以自然就返回结果12345这样了。


  • 1

Reply