Discuss / Python / 做了一点笔记

做了一点笔记

Topic source

这是笔记的网址,讨论区不方面长篇大论,就讲几点重要的吧:

元类 · 语雀 (yuque.com)

1. `ModelMetaclass` 中的 User类的 `attrs` 有哪些?

[('__module__', '__main__'), 
 ('__qualname__', 'User'), 
 ('__pydevd_ret_val_dict', {'IntegerField.__init__': None, 
                            'StringField.__init__':  None}), 
 ('id', <__main__.IntegerField object at 0x00000278A5528A30>), 
 ('name', <__main__.StringField object at 0x00000278A6B458B0>), 
 ('email', <__main__.StringField object at 0x00000278A6B45C70>), 
 ('password', <__main__.StringField object at 0x00000278A6B54F10>)]

2. 为什么要将那些属性移动到 `__mappings__` 中去?

因为User的类属性可能会被u实例的属性覆盖,例如 `u.id` 对应的值为12345,如果不移走,就会覆盖掉最初 `User.id` 所对应的的 IntegerField 对象

3. 关于 u 实例的创建

因为 User 类型继承了 `Model` 类,而 `Model` 继承了 `dict` 和 `ModelMetaclass` 类型,其初始化使用了 `super(Model, self).__init__(**kw)` 方法,Python会根据 MRO 顺序来寻找初始化方法:

>>> User.__mro__


(<class '__main__.User'>, <class '__main__.Model'>, <class 'dict'>, <class 'object'>)

也就是说,当 User 类中未定义 `__init__` 方法时,python会去 `Model` 中寻找,Model 中没有时,会继续去 `dict` 中寻找,因此 u 可以通过传入字典来创建实例。

4. Model 中定义的 `__getattr__` 和 `__setattr__` 方法有什么用?

我个人认为没啥用

5. ORM框架用元类写有什么用?

创建新的类时能简单一些,例如不用自己每次都copy一份 save 方法,但这些并不是必要的,至少90%的时候不会用到,所以看不懂的话不必死磕


  • 1

Reply