'''ORM框架实现'''
class Field(object): #python中的基类声明所有可能的传参
def __init__(self, name,value):
self.name = name
def __str__(self): #党类单独存在时,打印的信息
return ("%s" % self.__class__.__name__)
class IntField(Field):
def __init__(self, name):
super(IntField, self).__init__(name, 'INT')
class StringField(Field):
def __init__(self, name):
super(StringField, self).__init__(name, 'STR')
'''元类编程的核心在于类的定制'''
#type类是所有类的基类,使用type创建Model与User类
#User创建时,进入 metaclass进行创建
#Model类进行创建时, metaclass进行创建
class ModelMetaclass(type):
def __new__(cls, name, bases, attrs):
#假设创建的是Model,控制Model的创建行为
if name == "Model":
return type.__new__(cls, name, bases, attrs)
#假设创建的是User类,控制User创建的行为
mappings = dict()
for k,v in [(key, value) for key, value in attrs.items() if isinstance(value, Field)]:
print("mapping items is (%s , %s)" % (k, v))
mappings[k] = v
attrs.clear()
attrs['__mapping__'] = mappings
attrs['__table__'] = name
return type.__new__(cls, name, bases, attrs)
#Modellei操作元类创建出的mappings,执行一些操作
class Model(dict, metaclass=ModelMetaclass):
def __init__(self, **kwargs):
super(Model, self).__init__(**kwargs)
def __setattr__(self, name, value):
self[name] = value
def __getattr__(self, name):
return self[name]
def save(self):
fields = []
params = []
args = []
for k, v in self.__mapping__.items():
fields.append(v.name)
params.append('?')
args.append(getattr(self, k, None))
sql = 'insert into %s (%s) values (%s)' % (self.__table__, ','.join(fields), ','.join(params))
print('SQL: %s' % sql)
print('ARGS: %s' % str(args))
class User(Model):
id = IntField("id")
name = StringField("name")
email = StringField('email')
passwd = StringField('passwd')
if __name__ == "__main__":
u = User(id=12345, name='Michael', email='test@orm.org', passwd='my-pwd')
u.save()