iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >由ORM谈Python元类
  • 461
分享到

由ORM谈Python元类

2023-06-02 10:06:02 461人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

本文主要介绍了什么是类,如何动态的创建类,什么是元类,类的_metaclass_属性以及如何自己实现ORM。在谈python元类之前,我们先来看看ORM是什么:ORM 为Object Relational Mapping 的简称,中文意思为

本文主要介绍了什么是类,如何动态的创建类,什么是元类,类的_metaclass_属性以及如何自己实现ORM

在谈python元类之前,我们先来看看ORM是什么:

ORM 为Object Relational Mapping 的简称,中文意思为对象关系映射,ORM的出现,是为了解决面向对象和关系数据库之间不相匹配而出现的技术,目的是使用面向对象的思想来实现对数据库中表的操作,从而屏蔽掉底层的sql操作。

简单了解了ORM的概念,许多同学可能会想了解ORM是怎么实现的,以下代码摘自Django项目ORM的部分实现代码:

subclass_exception'__module__': module}
   if attached_to is not None:
           __reduce__return __setstate__'__reduce__'] = __reduce__         class_dict['__setstate__'] = return type>>> class MyClass():
...     pass
...
>>> type(MyClass) <type 'classobj'
>>>> type(MyClass()) <type 'instance'>

同时,它也具有对象的全部特征,如你可以对他进行赋值,拷贝,增加属性等的操作,如下示例:

>>> class MyClass():
...     pass ...
>>> print MyClass __main__.MyClass
>>> a = MyClass
>>> print a __main__.MyClass
>>> MyClass.__dict__
{'__module__': '__main__', '__doc__': None}
>>> MyClass.a = 100
>>> MyClass.__dict__
{'a': 100, '__module__': '__main__', '__doc__': None}
>>> >>> MyClass.a = 200
>>> MyClass.a200
>>>
如何动态的创建类?

最简单的方法,就是采用如下方法:

def create_class(class_name):     if class_name == "MyClass":
       class MyClass():             pass         return MyClass
   else:
       class OtherClasss():             pass         return OtherClasss

但是此类方法,不能称之为真正的动态,因为只能支持有限的类的创建,那有什么方法,能真正实现动态创建一些类呢? 所以,这里就不得不提到关键词type了,首先,我们大多数人谈起type,首先想到的是,type不就是用来测试变量类型的嘛,如下:

>>> type1)<type 'int'
>>>> print type"1")<type 'str'
>>>> class AtypetypeMyClass = MetaClass()
MyObject = MyClass()

而type,就是元类,于是创建一个类,就可以使用如下这种方式:

MyClass = type("MyClass", (), {})
MyObject = MyClass()
类的_metaclass_属性

当我们创建一个类的时候为其添加__metaclass__属性:

class Foo(object):     __metaclass__ = something… […]

那么,Python就会采用你指定的方法,来创建这个类,否则,会使用type来创建这个类,下面演示如何自定义的指定metaclass属性:

lower_attrfor name, val in class_attr.items():
       if name.startswith('__'):            lower_attr[name] = val
       else:            lower_attr[name.lower()] = return typeMyClss'A'     b = 'b'

my_class = MyClss()
hasattr'A') # False print hasattr'b') # True print hasattr'a') # True
如何自己实现ORM?

首先来定义Field类,它负责保存数据库表的字段名和字段的类型:

class Field(object):     def __init__(self, name, column_type):         self.name = name         self.column_type = column_type

在Field的基础上,进一步定义各种具体类型的Field,比如StringField,IntegerField等等:

class StringField(Field):     def __init__(self, name, max_length):         super(StringField, self).__init__(name, 'varchar(%d)' % max_length)  class IntegerField(Field):     def __init__(self, name):         super(IntegerField, self).__init__(name, 'int')

下一步,就是编写最复杂的ModelMetaclass了:

class ModelMetaclass(type):     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):                 mappings[k] = v         for k in mappings.keys():             attrs.pop(k)         attrs['__mappings__'] = mappings         attrs['__table__'] = name         return type.__new__(cls, name, bases, attrs)

以及基类Model:

class Model(dict, metaclass=ModelMetaclass):

   __init__super__init____getattr__try:
           return self[key]         except KeyError:             raise AttributeError"'Model' object has no attribute '%s'" % key)      def __setattr__savefor k, v in self.__mappings__.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))

创建User类,并调用save方法,保存:

class User(Model):     id = IntegerField('id')     name = StringField('username', max_length=48)     email = StringField('email', max_length=128)     passWord = StringField('password', max_length=24)  # 创建一个实例: u = User(id=12345, name='xiaoming', email='xiaoming@xiaomi.com', password='test') # 保存到数据库: u.save()

上面,我们就简单实现了一个ORM。

参考链接

stackoverflow:

https://stackoverflow.com/questions/100003/what-are-metaclasses-in-python 

廖雪峰的官方网站:

Https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386820064557c69858840b4c48d2b8411bc2ea9099ba000

由ORM谈Python元类

--结束END--

本文标题: 由ORM谈Python元类

本文链接: https://www.lsjlt.com/news/229775.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 由ORM谈Python元类
    本文主要介绍了什么是类,如何动态的创建类,什么是元类,类的_metaclass_属性以及如何自己实现ORM。在谈Python元类之前,我们先来看看ORM是什么:ORM 为Object Relational Mapping 的简称,中文意思为...
    99+
    2023-06-02
  • Python之元类ORM
    什么是元类在Python中一切皆对象,类也是一个对象,实例对象由类创建出来的,类是由元类创建出来的。简而言之,用来创建类的类就叫元类(metaclass)。 函数type其实就是一个元类,type就是Python在背后用来创建所有类的元类...
    99+
    2023-01-31
    Python ORM
  • Python元类编程实现一个简单的ORM
    目录概述效果步骤结束语完整代码概述 什么是ORM    ORM全称“Object Relational Mapping”,即对象-关系映射,就是把关系数据库的...
    99+
    2023-03-06
    Python元类编程ORM Python ORM
  • 如何使用Python元类特性实现ORM框架
    这篇文章主要介绍了如何使用Python元类特性实现ORM框架,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。ORM是什么O是 object,也就 类对象 的意思,R是 rela...
    99+
    2023-06-15
  • 怎么使用Python元类编程实现一个简单的ORM
    这篇文章主要讲解了“怎么使用Python元类编程实现一个简单的ORM”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用Python元类编程实现一个简单的ORM”吧!概述什么是ORM   ...
    99+
    2023-07-05
  • Python |浅谈爬虫的由来
    本文概要 本篇文章主要介绍Python爬虫的由来以及过程,适合刚入门爬虫的同学,文中描述和代码示例很详细,干货满满,感兴趣的小伙伴快来一起学习吧! 🌟🌟🌟...
    99+
    2023-09-01
    python 爬虫 开发语言 由来历史 原理机制
  • 浅谈Python的元编程
    目录一、装饰器二、装饰器的执行顺序三、元类四、descriptor 类(描述符类)五、总结 相应的元编程就是描述代码本身的代码,元编程就是关于创建操作源代码(比如修改、生成或包装原来...
    99+
    2024-04-02
  • python利用元类和描述器实现ORM模型的详细步骤
    ORM模型: ORM模型对于后端开发来说肯定是不陌生的,包括很多后端框架比如django,现在都自带这个模型了 ORM(Object Relational Mapping)对象关系映...
    99+
    2024-04-02
  • python中的元类
    目录 元类 什么是元类 自定义元类 其他 元类 什么是元类 我们创建一个类目的是为了...
    99+
    2023-01-30
    python
  • Python 5.5 使用元类
    使用元类type()动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时创建的,而是运行时动态创建的。比方说我们定义一个Hello的class,就写一个hello.py模块:class Hello(object):    def h...
    99+
    2023-01-31
    Python
  • Python黑魔法:元类
    Python黑魔法:元类 术语“元编程”指的是程序具有编写或操纵其自身作为它们资料的潜力。Python支持称为元类的类的元编程。 元类是一个深奥的面向对象编程(OOP)概念,隐藏在几乎所有的Python代码之后。无论你是否意识到它的存在,你...
    99+
    2023-01-31
    黑魔法 Python
  • python 使用元类type创建类
    目录1、type动态创建类 1.1 语法格式1.2 案例1:使用type创建类1.3 案例2:使用type创建带有属性(方法)的类1.4 案例3:使用type动态创建一个继...
    99+
    2024-04-02
  • python表达式由哪些元素构成
    python表达式是由运算符和操作数构成的,其中操作数可以使用标识符进行表示,如a=3;b=2;c=a*b;且表达式是一个值,单独的一个值是一个表达式,单独的变量也是一个表达式。...
    99+
    2024-04-02
  • 浅谈python数据类型及其操作
    目录一、Number 数字二、String 字符串三、List 列表四、Tuple 元组五、Sets集合六、Dictionary 字典 (非常重要)一、Number 数字 1.内置...
    99+
    2024-04-02
  • python 通过元类控制类的创建
    一、python中如何创建类? 1. 直接定义类 class A:   a = 'a'   2. 通过type对象创建 在python中一切都是对象 在上面这张图中,A是我们平常在python中写的类,它可以创建一个对象a。其实...
    99+
    2023-01-31
    python
  • 什么是python中的元类
    所属网站分类: python高级 > 面向对象 作者:goodbody 原文链接: http://www.pythonheidong.com/blog/article/11/ 来源:python黑洞网 www.pythonh...
    99+
    2023-01-31
    python
  • python中的元类metaclass详情
    目录动机从一个问题引出 MetaClassMetaclass 编程动机 python语言因为工作偏向于 AI ,所以对于这门语言还停留在表面,对于 python 深层并没有接触到。 ...
    99+
    2024-04-02
  • Python基础之元类详解
    1.python 中一切皆是对象,类本身也是一个对象,当使用关键字 class 的时候,python 解释器在加载 class 的时候会创建一个对象(这里的对象指的是类而非类的实例)...
    99+
    2024-04-02
  • 深入理解Python的元类
    目录什么是元类type元类动态创建类自定义元类总结什么是元类 Python中,一切皆对象,我们定义的数字、字符串、函数、列表等都是对象,对象是类(class)的是实例,而类(clas...
    99+
    2024-04-02
  • Python如何自定义元类
    这篇文章主要介绍了Python如何自定义元类,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、说明一个类没有声明自己的元类,默认他的元类就是type,除了使用元类type,用...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作