程序员开发实例大全宝库

网站首页 > 编程文章 正文

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

zazugpt 2025-04-02 00:17:27 编程文章 23 ℃ 0 评论

目录

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()` 关闭数据库连接。

什么IT

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表