Python元类
博客专区 > borey 的博客 > 博客详情
Python元类
borey 发表于3年前
Python元类
  • 发表于 3年前
  • 阅读 30
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

摘要: 注:代码运行在python 2.7.*版本之下

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()



  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 26
博文 54
码字总数 31182
×
borey
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: