linRichielinRichie
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
    • Python学习指南
  • 快速开始

    • Python: 输入与输出 (I/O)
    • Python: 异常处理 try-except
    • Python: List深入概述
    • Python: 面向对象编程(OOP)
  • Python 语法库函数

    • 语法库目录
    • 库

      • library目录
      • argparse:解析命令行参数
      • difflib:比较序列并生成差异信息
      • dnspython: DNS处理库
      • IPy:IP地址处理库
      • logging:记录和管理日志信息
      • os:访问和操作操作系统
      • psutil:系统性能信息库
      • re:正则表达式库
      • smtplib:邮件发送库
    • 函数

      • function目录
      • any() 函数
      • input 函数
      • lambda 和 map 函数
      • reversed()函数
      • zip()函数
    • 语句

      • statement目录
      • import 语句
      • Try/Exception 异常
    • 概念

      • concept目录
      • 深拷贝与浅拷贝
      • 列表、字典与元组
      • 文件读写
      • IO: 输入与输出
      • 逻辑判断与条件语句
      • OOP 面向对象:class
      • OOP: 面向对象编程
  • SQLAlchemy

    • 获取insert或者update的id
  • Pandas

    • Pandas目录
    • Pandas:基础操作
    • Pandas:数据处理与转换
    • Pandas: 数据写入 excel 表格
  • Python前端框架

    • Flask

      • 1. Flask简介
      • 2. Flask程序基本结构
      • 3. Flask请求-响应循环
      • 4. flask案例: 框架网页查询IP
      • Python: Flask中的GitHub OAuth
    • Django

      • chapter-01:Django框架认识

        • 1.1 Django的产生背景
        • 1.2 MTV设计模式
        • 1.3 Django 主要功能模块
      • chapter-02:开发环境配置

        • 2.1 Python的安装与配置
        • 2.2 虚拟环境安装与配置
        • 2.3 Django安装与配置
        • 2.4 MySQL安装配置
      • chapter-03:项目框架搭建

        • 3.1 Django管理工具-创建项目骨架
        • 3.2 修改项目的默认配置
        • 3.3 初始化项目环境
      • chapter-04:ORM应用与原理剖析

        • 4.1 构建POST应用需要的数据集
        • 4.2 Model相关的概念和使用方法
        • 4.3 Model的查询操作API
        • 4.4 ORM实现原理
      • chapter-05:Django管理后台

        • 5.1 将Model注册到管理后台
        • 5.2 管理后台实现原理
      • chapter-06:视图

        • 6.1 视图基础
        • 6.2 视图的高级特性和快捷方法
        • 6.3 基于类的通用视图
      • chapter-07:模板系统

        • 7.1 模板系统基础
        • 7.2 模板语言
      • chapter-08:表单系统

        • 8.2 使用表单系统实现表单: ModelForm
      • chapter-09:用户认证系统

        • 9.1 用户与身份认证
        • 9.2 权限管理
        • 9.3 用户认证系统应用
      • chapter-10:Django路由系统

        • 10.1 路由系统基础
      • chapter-11:Django中间件

        • 11.1 中间件基础
  • Python例子

    • Python: Linux的Shell命令
    • Python: PEP8自动格式化代码
    • Python: pip操作
    • Python: 业务服务监控
    • Python: 从文件逐行读取数据
    • 将链表转换为字符串
    • Python: 检查URL是否能正常访问
    • Python: 爬取网易云音乐
    • Python: 读取目录下的所有内容
    • 案例研究:文本统计
  • Python爬虫

    • 数据解析工具:Xpath
  • 算法题

    • 02:两数相加
    • 09:回文数
    • 13:罗马数值转换为整数
    • 14:最长公共前缀

4.4 ORM实现原理

  • 4.4 ORM实现原理
    • 4.4.1 Python元类
      • 如何用type动态创建类
    • 4.4.2 Python描述符

  • ORM是Django框架的核心模块 想精进,思考下:使用ORM提供的接口,在下面方面
  • 为什么创建的Model会自动拥有名称为id的主键
  • 查询管理器是什么,又是怎么添加到Model中的
  • QuerySet是什么样的结构

4.4.1 Python元类

类的类型是:type
Python中使用type确定对象的类型是比较常见的
type的一个重要功能:创建类

如何用type动态创建类

  • type创建类需要接收三个参数
    • 类的名称
    • 父类的元组
    • 属性字典
A = type('A',(),{})
print(A)
  • 例子
class A(object):
    hello = 'World'
    def fun(self):
        return "Hello"

可以通过type来实现,如下

def fun(self):
    return "Hello"
A = type('A',(),{'hello':'World','fun':fun})
  • 通过type继承
B = type('B',(A,),{})
b = B()
b.fun()

Python在创建类对象(不是类实例对象)的时候,首先会从当前的类定义中查询是否指定了元类,如果没有,则继续在父类中寻找指定的元类。如果在任何父类中都找不到元类的声明,就会上升到模块层次去查询。最终,如果还没有找到元类的声明,Python就会使用内置的type来创建这个类

在Python中 __new__()方法用来创建实例 __init__()负责初始化实例

  • 需要修改类的属性,就需要重写元类的__new__()方法
class BBSMeta(type):
    def __new__(cls, name, bases, attrs):   
        attrs['desc'] = lambda self: 'django bbs'
        return type.__new__(cls, name, bases, attrs)

class A(metaclass=BBSMeta):
    pass

a = A()
print(a.desc())

首先需要知道,在Python中,__new__方法用来创建实例,__init__负责初始化实例。所以,如果要修改类的属性,就需要重写元类的__new__方法。它接收四个参数:需要实例化的类对象、类的名字、类继承的父类集合、类的属性字典。

可以看到,BBSMeta类继承自type,它可以作为一个元类使用,且它实现了__new__方法,并给类添加了desc方法。之后,类A指定元类为BBSMeta,所以,A的实例就有了desc方法。

4.4.2 Python描述符

描述符就是实现了描述符协议的对象,描述符协议包含三个方法:

  • __get__
  • __set__
  • __delete__ 只要实现了这三个方法中的任意一个,这个类对象就被称作描述符,且这个类对象的实例就有了一些特殊的特性

如何声明__get__(self, instance, owner):用于访问属性,返回属性的值 __set__(self, instance, owner):设置属性的值,不返回任何内容 __delete__(self, instance):用于删除属性,不返回任何内容

只实现了__get__方法的对象成为非数据描述符,这类描述符只能读取对象属性
同时实现了__get__和__set__方法的对象是数据描述符,可以实现对属性的读写

参考文档:微信读书: https://weread.qq.com/web/reader/6e4329007193f1e66e43129k37632cd021737693cfc7149

最近更新时间:
Prev
4.3 Model的查询操作API