Discuss / Python / None
for k in mappings.keys():    attrs.pop(k)

刚开始不明白为什么要pop掉这些,文章里也只是说了一句实例属性覆盖类属性,既然是实例属性覆盖类属性,那为什么要去掉类属性呢,反正它也会被覆盖

多琢磨了一下,发现新建了一个User类的实例

u = User(id=12345, name='Michael', email='test@orm.org', password='my-pwd')

之后,如果不去掉类属性,这时的 u 是有 id、name、email等类属性,和id、name、email等key,因为它继承自字典,可以就当成{'id': 12345, 'name': 'Michael', 'email': 'test@orm.org'}看待

然后后面有句

args.append(getattr(self, k, None))

这里的k就是id、name、email等值,如果不pop掉这些类属性,那么得到的就是 IntegerField('id')、StringField('username')等值,而我们想要的是他们实际的值,这时候如果把类属性pop了,那么会去

def __getattr__(self, key):    try:        print('}}}', self)        return self[key]

这里面找,这时候返回的就是对应key的值了

大概是因为这样吧

侠骨闻香

#2 Created at ... [Delete] [Delete and Lock User]
占地记录:
1、获取实例的属性时(./getattr),如果该属性存在,会直接返回,获取不到时才会尝试调用__getattr__来获取,由于类属性所有实例都可以访问,所以要pop掉同名的类属性,使之通过__getattr__返回预期中的u['id']/u['name']...
2、Model类继承了dict,又通过__getattr__、__setattr__进行了扩展,不仅可以通过u['id']的方式来取值和赋值,还可以把key当成属性,通过u.key的方式取值赋值。
3、args.append(getattr(self, k, None)这句改成agrs.append(self.get(k, None)), 没有pop语句、没有__getattr__、__setattr__,示例代码运行也不会有问题,但就不能把key当属性,把value当属性值来操作了



  • 1

Reply