元类介绍

type可以直接生成类(class),但也可以先生成元类(metaclass),再使用元类批量定制类(class)

使用 class 创建类 ​

  class Hello():def say(self, name='world'):print('Hello, %s' % name) h = Hello()h.say()

使用 type 直接创建

  def say(self, name='world'):print("Hello, %s" % name)Hello = type('Hello', (object, ), dict(say_hello=say))h = Hello()h.say()

先生成元类 metaclass,再批量创建

  # 传入typeclass SayMetaClass(type):​# 传入      类名称、父类、属性def __new__(cls, name, bases, attrs):# 添加属性 attrs['say_'+name] = lambda self,value,saying=name: print(saying+','+value+'!')# 传承三大:类名称、父类、属性return type.__new__(cls, name, bases, attrs)​# 创建类class Hello(object, metaclass=SayMetaClass):pass​# 创建实列hello = Hello()​# 调用实例方法hello.say_Hello('world!')  # Hello, world!   类名 + 传入的参数​class NiHao(object, metaclass=SayMetacalss):pass​n = NiHao()n.say_NiHao("中国")  # NiHao, 中国!

元类的应用

参考文章 快速掌握元类

ORM 对象关系映射

class Field(object):​def __init__(self, name, column_type):self.name = nameself.column_type = column_type​def __str__(self):return '<%s: %s>' % (self.__class__.__name__, self.name)​​class StringField(Field):​def __init__(self, name):super().__init__(name, 'varchar(100)')​​class IntegerField(Field):​def __init__(self, name):super().__init__(name, 'bigint')​​class ModelMetaClass(type):"""元类""""""创建一个新的字典mapping将每一个类的属性,通过.items()遍历其键值对。如果值是Field类,则打印键值,并将这一对键值绑定到mapping字典上。将刚刚传入值为Field类的属性删除。创建一个专门的__mappings__属性,保存字典mapping。创建一个专门的__table__属性,保存传入的类的名称。"""def __new__(cls, name, bases, attrs):if name == 'Model':return type.__new__(cls, name, bases, attrs)print('Found model: %s' % name)mappings = dict()for k, v in attrs.items():if isinstance(v, Field):print('Found mapping: %s ==> %s' % (k, v))mappings[k] = vfor k in mappings.keys():attrs.pop(k)attrs["__mappings__"] = mappingsattrs["__table__"] = namereturn type.__new__(cls, name, bases, attrs)​​class Model(dict, metaclass=ModelMetaClass):"""创建 Modle 来自于元类"""​def __init__(self, **kwargs):super().__init__(**kwargs)​def __getattr__(self, key):try:return self[key]except KeyError:raise AttributeError("'Model' object has no attribute '%s'" % key)​def __setattr__(self, key, value):self[key] = value​def save(self):"""模拟 sql 语句"""fields = []args = []for k, v in self.__mappings__.items():fields.append(v.name)args.append(getattr(self, k, None))sql = 'insert into %s (%s) values (%s)' % (self.__table__, ','.join(fields), ','.join(str(i) for i in args))print("SQL: %s" % sql)print("Args: %s" % str(args))​​class User(Model):"""创建子类""""""id= IntegerField(‘id’)就会自动解析为:Model.__setattr__(self, ‘id’, IntegerField(‘id’))因为IntergerField(‘id’)是Field的子类的实例,自动触发元类的__new__,所以将IntergerField(‘id’)存入__mappings__并删除这个键值对"""id = IntegerField('id')name = StringField('username')email = StringField('email')password = StringField('password')​"""实例化过程中先调用Model.__setattr__,将键值载入私有对象然后调用元类的“天赋”,ModelMetaclass._new_,将Model中的私有对象,只要是Field的实例,都自动存入u.__mappings__"""# 实例化 Useru = User(id=12345, name='Batman', email='12343@qq.com', password='qwerqwer')u.save()

Python的元类的用法相关推荐

  1. Python 的元类设计起源自哪里?

    △点击上方"Python猫"关注 ,回复"1"领取电子书 一个元老级的 Python 核心开发者曾建议我们( 点击阅读),应该广泛学习其它编程语言的优秀特性,从 ...

  2. Python之元类ORM

    1. 什么是元类 在Python中一切皆对象,类也是一个对象,实例对象由类创建出来的,类是由元类创建出来的.简而言之,用来创建类的类就叫元类(metaclass). 函数type其实就是一个元类,ty ...

  3. python 用元类 type 实现对数据库的ORM 映射

    python 实现对数据库的ORM 映射 如果使用pymysql 操作数据库 不借助框架的话,频繁写sql语句, 的确比较麻烦 这里借助 type 元类 对 数据表类实现了 与mysql之间的 映射 ...

  4. Python使用元类约束派生类中必须实现指定的成员

    推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020年6月第1次印刷,2021年12月第11次印刷,山东省一流 ...

  5. python元类是什么_谈谈Python中元类Metaclass(一):什么是元类

    简单的讲,元类创建了Python中所有的对象. 我们说Python是一种动态语言,而动态语言和静态语言最大的不同,就是函数和类不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个HelloW ...

  6. python的元类与类继承的区别

    类的继承,主要涉及   类之间关系. 元类metaclass,某种意思上可以理解为类的父类:类是元类的实例. 第一:type函数创建类 在python中,类也是对象.既然是类是对象,必然有个存在生成它 ...

  7. Python 的元类问题

    一.元类 ​       元类 ​      元类就是类的类,python中函数type实际上是一个元类.type就是Python在背后默认用来创建所有类的元类.Python中所有的东西--都是对象. ...

  8. python设计一个长方形类_类设计模式python学习~元类

    废话就不多说了,开始... 元类是类的模版,在类的层次上标准类的行为. 面下用使元类现实单例设计模式(设计模式九 采取的是另一种方法): from warnings import * 每日一道理 坚持 ...

  9. python元类的使用_python中元类用法实例

    本文实例讲述了python中元类用法,分享给大家供大家参考.具体方法分析如下: 1.元类(metaclass)是用来创建类的类 2.type(object):返回一个对象的类型,与object.__c ...

最新文章

  1. php运算符的关键字,PHP 运算符
  2. workflow and email in QD3 - IS_INBOX_USER method
  3. jvm需要多长时间才能进行转义分析? 可能比您想象的要长。
  4. Oracle 11g数据库管理与开发指南
  5. 中html倒入css那么套路,CSS常用套路
  6. leetcode - 1049. 最后一块石头的重量 II
  7. Spring Boot学习总结(14)——Spring Boot常见面试题汇总
  8. 拼装sql_2020最新最全面的SQL优化干货总结
  9. promise.all是并发执行吗_你真的会用Volatile了吗?
  10. 高斯消元--模板,原理
  11. Delphi实现通用的定时自动关机程序
  12. win10系统怎样安装/更新独立显卡驱动
  13. CSS中几种解决高度坍塌方式分析
  14. 用计算机语言说一局情话,计算机中的情话
  15. 腹有诗书气自华,新华三交换机大有不同
  16. 微信小程序10-微搭模板
  17. Android Studio Build failed(出现 gradle sync failed 问题)解决方法
  18. php 读取纯真书库,PHP读取纯真IP数据库的函数
  19. c语言之 杨辉三角
  20. 业务与信息系统乱弹琴

热门文章

  1. MySQL中DDL语言
  2. MySQL没卸载干净
  3. 随机变量及其函数分布
  4. java 面向对象之构造器:
  5. 华为云用AI让“12345”热线更便民
  6. Javascript基础 86个面试题汇总 (附答案)
  7. python是静态语言还是动态语言_Python笔记--动/静态语言部分区别
  8. Linux中sh文件的执行方法
  9. ffmpeg教程-手把手教你如何简单快捷处理音视屏
  10. 搞笑但又真实无比! 59条和程序员相关的名人语录,哪一条让你感同身受?