22-4-Python高级特性-元类-描述符-练习

liftword1个月前 (04-25)技术文章12

5-元类

5-1-概念

  1. 元类是创建类的类。
  2. 在 Python 中,默认的元类是 `type`。
  3. 可以通过自定义元类来控制类的创建过程,如修改类的属性、方法等。

5-2-示例

5-2-1-代码

# 定义元类
class MyMeta(type):
    def __new__(cls, name, bases, dct):
        # 在类创建时动态添加属性和方法
        dct["new_attribute"] = "This isa a new attribute"
        
        def new_method(self):
            return "This is a new method"
        
        dct["new_method"] = new_method
        
        # 调用父类的 __new__ 方法创建类
        return super().__new__(cls, name, bases, dct)

# 使用元类创建类
class MyClass(metaclass=MyMeta):
    pass

# 测试
obj = MyClass()
print(obj.new_attribute)  # 输出: This is a new attribute
print(obj.new_method())   # 输出: This is a new method

5-2-2-输出结果

5-2-3-代码分析

  1. MyMeta 是一个自定义元类,继承自 type。
  2. __new__ 方法在类创建时被调用,允许我们修改类的属性和方法。
  3. dct 是一个字典,包含了类的所有属性和方法。
  4. 我们在 dct 中动态添加了一个属性 new_attribute 和一个方法 new_method。

6-描述符

6-1-概念

  1. 描述符是实现了 `__get__()`、`__set__()` 或 `__delete__()` 方法的对象,用于控制对类属性的访问。
  2. 描述符可以用于实现属性的验证、计算属性等功能。

6-2-示例

6-2-1-代码

class PositiveNumber:
    def __get__(self, instance, owner):
        return instance._value

    def __set__(self, instance, value):
        if value < 0:
            raise ValueError("Value must be positive")
        instance._value = value


class MyClass:
    number = PositiveNumber()

    def __init__(self, value):
        self.number = value


obj = MyClass(5)
print(obj.number)
try:
    obj.number = -1
except ValueError as e:
    print(e)

6-2-2-代码分析

`PositiveNumber` 是一个描述符类,实现了 `__get__()` 和 `__set__()` 方法。

`__set__()` 方法用于验证属性值是否为正数,如果不是则抛出 `ValueError` 异常。

`MyClass` 类使用 `PositiveNumber` 描述符来控制 `number` 属性的访问。

7-练习题-Python操作MySql数据库

要实现连接 MySQL 数据库并对 `users` 表进行增删改查(CRUD)操作,可以使用 Python 的 `mysql-connector-python` 或 `pymysql` 库。以下是基于 `mysql-connector-python` 的实现示例。

7-1-安装依赖

首先需要安装 `mysql-connector-python`:

pip install mysql-connector-python

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple mysql-connector-python

7-2-数据库准备

假设你已经有一个 MySQL 数据库,并且其中有一个名为 `users` 的表,表结构如下:


CREATE TABLE `w_user`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `phone` varchar(100) NULL DEFAULT NULL COMMENT '手机号',
  `email` varchar(100) DEFAULT NULL COMMENT '邮箱',
  `password` varchar(255) DEFAULT NULL COMMENT '密码',
  `salt` varchar(50) DEFAULT NULL COMMENT '盐值',
  `createTime` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  `updateTime` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ;


7-3-Python 实现 CRUD 操作

以下代码展示了如何连接 MySQL 数据库并对 `users` 表进行增、删、改、查操作。

import mysql.connector
from mysql.connector import Error
from datetime import datetime

# 连接数据库的函数
def create_connection(host, user, password, database):
    try:
        connection = mysql.connector.connect(
            host=host,
            user=user,
            password=password,
            database=database
        )
        if connection.is_connected():
            print("成功连接到数据库")
        return connection
    except Error as e:
        print(f"连接失败: {e}")
        return None

# 插入数据(Create)
def insert_user(connection, id,phone,email,password,salt,createTime,updateTime):
    try:
        cursor = connection.cursor()
        query = "INSERT INTO w_user (id,phone,email,password,salt,createTime,updateTime) VALUES (%s, %s, %s,%s, %s, %s, %s)"
        values = (id,phone,email,password,salt,createTime,updateTime)
        cursor.execute(query, values)
        connection.commit()
        print(f"插入成功: {cursor.rowcount} 条记录")
    except Error as e:
        print(f"插入失败: {e}")

# 查询数据(Read)
def select_users(connection):
    try:
        cursor = connection.cursor(dictionary=True)
        query = "SELECT * FROM w_user"
        cursor.execute(query)
        rows = cursor.fetchall()
        for row in rows:
            print(row)
    except Error as e:
        print(f"查询失败: {e}")

# 更新数据(Update)
def update_user(connection, id,phone,email,password,salt,createTime,updateTime):
    try:
        cursor = connection.cursor()
        query = "UPDATE w_user SET id = %s, phone = %s, email = %s , password = %s, salt = %s, createTime = %s, updateTime = %s WHERE id = %s"
        values = (id,phone,email,password,salt,createTime,updateTime)
        cursor.execute(query, values)
        connection.commit()
        print(f"更新成功: {cursor.rowcount} 条记录")
    except Error as e:
        print(f"更新失败: {e}")

# 删除数据(Delete)
def delete_user(connection, user_id):
    try:
        cursor = connection.cursor()
        query = "DELETE FROM w_user WHERE id = %s"
        values = (user_id,)
        cursor.execute(query, values)
        connection.commit()
        print(f"删除成功: {cursor.rowcount} 条记录")
    except Error as e:
        print(f"删除失败: {e}")

# 主程序
if __name__ == "__main__":

    # 数据库连接信息
    host = "localhost"
    user = "username"
    password = "pwssword"
    database = "dbName"

    # 创建数据库连接
    connection = create_connection(host, user, password, database)

    if connection:
        # 插入用户
        insert_user(connection, "1","13910118191", "1901@qq.com", "123456","1234",datetime.now(),datetime.now())
        insert_user(connection, "2","12910118192", "1902@qq.com", "654321","4321",datetime.now(),datetime.now())


        # 查询所有用户
        print("查询所有用户:")
        select_users(connection)

        # 更新用户
        print("更新用户:")
        update_user(connection, 1, "11910118111", "1911@qq.com", "123411","1211",datetime.now(),datetime.now())
        select_users(connection)

        # 删除用户
        print("删除用户:")
        delete_user(connection, 2)
        select_users(connection)

        # 关闭连接
        connection.close()
        print("数据库连接已关闭")

7-4-输出结果

7-5-代码说明

7-5-1-数据库连接

- 使用 `mysql.connector.connect()` 方法连接数据库。

- 如果连接成功,返回一个连接对象;否则打印错误信息。

7-5-2-插入数据

- 使用 SQL `INSERT INTO` 语句插入数据。

- 参数化查询(`%s` 占位符)防止 SQL 注入攻击。

7-5-3-查询数据

- 使用 SQL `SELECT` 语句查询数据。

- 设置 `dictionary=True` 可以让结果以字典形式返回,便于处理。

7-5-4-更新数据

- 使用 SQL `UPDATE` 语句更新指定用户的记录。

7-5-5-删除数据

- 使用 SQL `DELETE` 语句删除指定用户的记录。

7-5-6-关闭连接

- 操作完成后,调用 `connection.close()` 关闭数据库连接。

相关文章

由ArcMap属性字段自增引出字段计算器使用Python的技巧

1.前言前些日子有人问我ArcMap中要让某个字段的值实现自增有什么方法?我首先想到像SQL Server中对于数值型字段可以设置自增。所以我打开ArcCatalog查看发现只提供默认值,没办法只能看...

Python入门秘籍曝光!速来围观!#Python学习#大学生进阶

Python入门真·秘籍(大学生黄金版)一、**「黑科技」级学习心法代码逆向学习法(突破常规)操作步骤:在GitHub搜索「student-manager」(大学生项目)直接下载并运行代码,观察功能效...

假期苦短,我用Python!这有个自动回复拜年信息的小程序

大数据文摘出品作者:李雷有没有也被拜年短信(大部分是群发)搞得很焦虑?不回复似乎显得很没有礼貌,一一回复又累心劳神。有没有既不浪费时间又能保持礼貌的办法呢?人生苦短,我用Python!知乎博主“余博伦...

AI 成长日记:Python语言的学习第四天

今天是学习的第三天,今天的内容还是针对于Python中有布尔类型(bool)的内容来进行分享!在 Python 的编程世界里,布尔类型虽然看似简单,却扮演着极为关键的角色。它就像一位裁判,为程序中的各...

python入门-day14-周末小项目

周末小项目 - 简易记事本 的内容。这是一个综合练习,结合之前学过的函数、文件操作和异常处理,设计一个简单的命令行记事本程序。我会用清晰的步骤和代码带你实现添加、查看、删除笔记并保存到文件的功能,确保...

跟我一起学习Python 吧——我的Python控制结构教程

一、引言在编程的世界里,控制结构是构建程序逻辑的基石。Python作为一种简洁而强大的编程语言,提供了丰富且易用的控制结构,使得开发者能够灵活地控制程序的执行流程。无论是简单的条件判断,还是复杂的循环...