Discuss / Python / 已经看了很多遍了,还是想不通为什么要用元类

已经看了很多遍了,还是想不通为什么要用元类

Topic source

我只用简单的继承,便可以实现,用元类的好处在哪里呢? class Base(object): def init(self,kw): self.attrs=kw for key,value in kw.items(): setattr(self,key,value) def find(self,id): pass def save(self): for s,v in self.attrs.items(): print(s) print(getattr(self,'_table')) def update(self,kw): pass def delete(self): pass

class IdField(object): pass class User(Base): _table="users" classfield=IdField() class Blog(Base): _table="blogs" id=IdField()

骐骥丶

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

如果你用过django就知道为什么用元类创建类,而不是继承了,Django框架中的ORM,首先你在models.py文件中创建自定义model,创建完之后,就要执行迁移命令,从而在数据库中建立相关数据表,这样在你就可以通过SQL脚本导入数据,也可以通过python代码中的SQL语句写入数据,达到了解耦的目的,如果你只是继承,只有在实例化的时候才会建立数据表,而用元类创建类,在你实例化之前就已经建立好数据表了。如果不明白,你可以先把u = User(id=12345, name='Michael', email='test@orm.org', password='my-pwd') u.save()这两句实例化代码去掉运行一下orm.py,在运行一下你自己用继承写的代码,两者比较一下。

廖雪峰

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

你的Base的init拿不到子类定义的任何属性

按照你的User定义:

u1 = User(id=1, name='A')
u2 = User(id=2, age=23)

无法知道应该如何映射到数据库的表结构,换句话说,Base的save()方法拼不出正确的SQL语句


  • 1

Reply