文档章节

Python元类

borey
 borey
发布于 2015/02/10 15:35
字数 394
阅读 31
收藏 0

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



© 著作权归作者所有

共有 人打赏支持
上一篇: Python基本语法
下一篇: Python面向对象
borey
粉丝 27
博文 55
码字总数 31182
作品 0
深圳
程序员
私信 提问
Python学习笔记二十四( 元类 )

class属性 class属性可以查看对象的类型. Person 类的实例对象person 的类型时Person 类类型, Python 是面向对象的语言, 那么Person 的类对象的类型又是什么? Person / int / str 的类对象的...

DragonFangQy
05/27
0
0
深刻理解Python中的元类(metaclass)

深刻理解Python中的元类(metaclass) 译注:这是一篇在Stack overflow上很热的帖子。提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解。他知道这肯定...

memorybox
2013/05/05
0
0
深刻理解Python中的元类

译注:这是一篇在Stack overflow上很热的帖子。提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解。他知道这肯定和自省有关,但仍然觉得不太明白,希...

ifnoelse
2014/07/21
0
0
Python基础总结成千行代码,让Python入门更简单!

只要学会这千行代码,不管你是零基础还是弱基础或是没有接触过编程,都可以快速入门Python!当时我就不信邪啊,等我看完之后,即使作为一个Python老鸟了,还是领会到了很多教授他的独特见解!...

糖宝lsh
09/10
0
0
移植到 Python 3

经历移植jinja2到python3的痛苦之后,我把项目暂时放一放,因为我怕打破python3的兼容。我的做法是只用一个python2的代码库,然后在安装的时候用2to3工具翻译成python3。不幸的是哪怕一点点的...

oschina
2013/05/21
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

java框架学习日志-2

上篇文章(java框架学习日志-1)虽然跟着写了例子,也理解为什么这么写,但是有个疑问,为什么叫控制反转?控制的是什么?反转又是什么? 控制其实就是控制对象的创建。 反转与正转对应,正转...

白话
9分钟前
0
0
Integer使用双等号比较会发生什么

话不多说,根据以下程序运行,打印的结果为什么不同? Integer a = 100;Integer b = 100;System.out.println(a == b);//print : trueInteger a = 200;Integer b = 200;System.out.pr...

兜兜毛毛
昨天
5
0
CockroachDB

百度云上的CockroachDB 云数据库 帮助文档 > 产品文档 > CockroachDB 云数据库 > 产品描述 开源NewSQL – CockroachDB在百度内部的应用与实践 嘉宾演讲视频及PPT回顾:http://suo.im/5bnORh ...

miaojiangmin
昨天
4
0
I2C EEPROM驱动实例分析

上篇分析了Linux Kernel中的I2C驱动框架,本篇举一个具体的I2C设备驱动(eeprom)来对I2C设备驱动有个实际的认识。 s3c24xx系列集成了一个基于I2C的eeprom设备at24cxx系列。at24cxx系列芯片包...

yepanl
昨天
5
0
设计模式之工厂模式

本篇博文主要翻译这篇文章: https://www.journaldev.com/1392/factory-design-pattern-in-java 由于翻译水平有限,自认为许多地方翻译不恰当,欢迎各位给出宝贵的建议,建议大家去阅读原文。...

firepation
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部