Discuss / Python / 一点点元类的理解,希望能帮助到大家。

一点点元类的理解,希望能帮助到大家。

Topic source

多方搜索参考别人的答案,总算看懂了为什么要从attrs.pop()。元类用于创建类的时候,元类的new方法先于被创建类的init()方法。当u = User(id=12345, name='Michael', email='test@orm.org', password='my-pwd')时,首先建立User类里头有属性id,name(但此时并没有创建出类的实例)等,由于Model是User类父类,而Model类使用了元类,故先调用的方法为元类中new()。以id为例,在mappings字典中此时建立的应该是{id:IntegerField('id')}。假设没有attrs.pop()那么在调用u.save()时,getattr()首先从类的属性或者父类的属性中找,只有查询不到时,才会到getattrs中查找。由于没有把原本的id关键字弹出,故getattr便能从类的属性id=IntegerField得到IntegerField。一旦有了attrs.pop()在类中就查询不到相应的属性,那么就要调用getattrs而返回值是self[k],由于self不是指类而是类的实例,所以能够成功返回,构建实例时创建id的值12345,这样就正确得到传入的实参值

material_w

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

点赞


  • 1

Reply