我实现了orm,发现有错,廖老师审核下,看看是不是错了
Topic sourceModel上添加元类更加合理,总不能每次生成子类User都写一堆metaclass='...'这样的代码吧。
元类调用的机制是:创建类的时候会在自己的身上找元类
也就是在使用class定义类的时候传入的metaclass关键字参数,通常情况下我们定义一个类这样写class Person(object),实际上这里缺省的metaclass为系统提供的class Person(object,metaclass='')。
没有找到就从父类上找,一直向上到object还是没有找到就使用内置的元类来生成类,也就是调用type('name',base,attrs),或者调用type.new(cls,name,base,attr),cls是类本身。
这里判断:
if name == 'Model':
return type.__new__(cls,name,base,attr)
和
if not Model in base:
return type.__new__(cls,name,base,attr)
效果是一样的,都是为了保证生成Model子类的时候使用ModelMetaclass,生成Model自身的时候使用系统元类。
后者是在生成Model类的时候直接调用系统提供的元类,不使用自定义的元类,其衍生的子类使用自定义的元类。因为Model类和其没有另外指定metaclass的子类都会来找这个ModelMetaclass来生成类
前者表示如果你这个类不是Model的子类就也直接调用系统元类,并不会调用专门为Model子类写的元类
- 1
_ForrestGump
class Model(dict): class User(Model, metaclass=ModelMetaClass): metaclass=ModelMetaClass应该放在User中, 判断条件需要改成if not Model in bases:
个人代码测试可用