博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python元类
阅读量:5975 次
发布时间:2019-06-19

本文共 2412 字,大约阅读时间需要 8 分钟。

hot3.png

1,使用type()函数运行时动态创建Class

2,定义metaclass类从type类继承,重写__new__方法,注意区分Model类和从Model继承的子类

3,定义模板类Model,使用__metaclass__ = metaclass元类

4,定义User类从Model类继承实现“Object Relational Mapping”,即对象-关系映射

#!/usr/bin/python#-*- coding: utf-8 -*-class Field(object):	"""docstring for Field"""	def __init__(self, name, colum_type):		super(Field, self).__init__()		self.name = name		self.colum_type = colum_type	def __str__(self):		return '<%s:%s>' %(self.__class__.__name__, self.name)		class StringField(Field):	"""docstring for StringField"""	def __init__(self, name):		super(StringField, self).__init__(name, 'varchar(100)')class IntegerField(Field):	"""docstring for IntegerField"""	def __init__(self, name):		super(IntegerField, self).__init__(name, 'bigint')class ModelMetaclass(type):	"""docstring for ModelMetaclass"""	def __new__(cls, name, bases, attrs):		print 'ModelMetaclass', cls, name, bases, attrs		if name == 'Model': #区分Model与其子类型			return type.__new__(cls, name, bases, attrs)		print 'Found model:%s' %name		mappings = dict()		for k, v in attrs.iteritems():			if isinstance(v, Field):				print 'Found mappings: %s ==> %s' %(k, v)				mappings[k] = v		#删除Model子类的同名属性		for k in mappings.iterkeys():			attrs.pop(k)			attrs['__mappings__'] = mappings		attrs['__table__'] = name		return type.__new__(cls, name, bases, attrs)					class Model(dict):	"""docstring for Model"""	__metaclass__ = ModelMetaclass	def __init__(self, **kw):		super(Model, self).__init__(**kw)		def __getattr__(self, key):		try:			return self[key]		except KeyError:			raise AttributeError(r'"Model" object has no attribute' %key)		def __setattr__(self, key, value):		self[key] = value	def save(self):		field = []		params = []		args = []		for k, v in self.__mappings__.iteritems():			field.append(v.name)			params.append('?')			args.append(getattr(self, k, None))		sql = 'insert into %s (%s) values (%s)' %(self.__table__, ','.join(field), ','.join(params))		print 'Sql: %s' %sql		print 'ARGS: %s' %str(args)		class User(Model):	"""docstring for User"""	def __init__(self, **kw):		super(User, self).__init__(**kw)	id = IntegerField('uid')	name = StringField('username')	email = StringField('email')	password = StringField('password')		def main():	#“Object Relational Mapping”,即对象-关系映射	u = User(id='123456', name='Mick', email='mick@gmail.com', password='12345678')	u.save()if __name__ == '__main__':	main()

转载于:https://my.oschina.net/xlplbo/blog/377341

你可能感兴趣的文章
嵌入式C语言自我修养 01:Linux 内核中的GNU C语言语法扩展
查看>>
python list 线性访问和随机访问比较
查看>>
python笔记(三)---文件读写、修改文件内容、处理json、函数
查看>>
jdk安装
查看>>
[九省联考2018]IIIDX
查看>>
Mysql学习总结(10)——MySql触发器使用讲解
查看>>
C# XML与对象互相转换
查看>>
Java中如何使封装自己的类,建立并使用自己的类库?
查看>>
spring 源代码地址
查看>>
为什么是List list = new ArrayList() 而不直接用ArrayList
查看>>
mingw64环境搭建
查看>>
R中,数据标准化方法
查看>>
Batch update
查看>>
带有重复元素的旋转数组的处理
查看>>
我的人工智能机器人的游戏
查看>>
NSQ端口关系以及注意事项
查看>>
有哪些值得推荐的关于英文词根的好书?
查看>>
Intent-filter匹配规则
查看>>
MD5 加密原理(转)
查看>>
js http 请求 多个相同参数名传值
查看>>