vlambda博客
学习文章列表

Py测开《操作mysql的上下文管理器代码详解、多态和私有属性含义的总结》

目录

  • 一、实现一个操作mysql的上下文管理器(可以自动断开连接)
    • 1.代码
    • 2.操作mysql的上下文管理器代码详解
    • 3. cur.fetchone()cur.fetchall()的区别
  • 二、描述 __slots__属性的作用,并修改读取excel类中保存用例的类
  • 三、面向对象的三大特征是什么?多态又是什么?
  • 四、私有属性怎么定义,不同的定义方式有什么区别?

一、实现一个操作mysql的上下文管理器(可以自动断开连接)

1.代码

import  pymysql
class DB:
    # 数据库操作的上下文管理器。

    def __init__(self,data_conf):
        self.con=pymysql.connect(**data_conf)
        self.cursor=self.con.cursor()

    def __enter__(self):
        return self.cursor

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.cursor.close()
        self.con.close()

DATABASES_CONF=dict(
    host='localhost',
    user='root',
    password='保密',
    database='member',
    port=3306,
    charset='utf8')
with DB(DATABASES_CONF) as cur:
    cur.execute('SELECT * FROM A')
    print(cur.fetchone())


运行结果
Py测开《操作mysql的上下文管理器代码详解、多态和私有属性含义的总结》
我的mysql数据库

2.操作mysql的上下文管理器代码详解

一个类里面只要实现了__enter____exit__方法,这个类所创建出来的对象就是个上下文管理器对象了。

通过with可以触发上下文管理器。上下文管理器对象会自动调用里面的__enter__方法。

实现一个操作数据库的上下文,当我们触发这个上下文管理器的时候,这个时候会返回一个操作数据库的游标。

DB是上下文管理器的类,这个会创建一个对象。DATABASES_CONF会传到init方法里面去。

在init方法里面接收data_conf这个数据的配置。在这里接受到这个参数之后,通过pymsql这个模块连接到数据库。连接到数据库之后会返回一个con连接,那么通过这个连接获取到cursor这个操作的游标。

创建对象,这里DB(DATABASES_CONF)完了之后,as cur返回的数据是通过__enter__这个方法里面返回的:

Py测开《操作mysql的上下文管理器代码详解、多态和私有属性含义的总结》

在这个方法里面把获取的连接的游标返回出去。

返回出去之后,在with语句里面就可以实现sql语句了:

Py测开《操作mysql的上下文管理器代码详解、多态和私有属性含义的总结》

查询了条数据,获取了第一条数据看一下。

with下面的语句执行完毕之后,上下文管理器里面的__exit__方法会自动触发。当这个方法触发的时候,会将数据库的连接在里面进行关闭。首先关闭游标,再关闭和数据库的连接:

Py测开《操作mysql的上下文管理器代码详解、多态和私有属性含义的总结》

通过这个就可以实现一个操作数据库的上下文管理器。操作数据库的时候只需要传进去相关的配置,然后拿到这个游标就可以对数据库进行相关的操作。操作完毕以后不需要手动关闭,上下文管理器会为我们自动关闭。

3.cur.fetchone()cur.fetchall()的区别

cur.fetchone():查询出有多条数据的时候,将只取最上面的第一条结果。

cur.fetchall():查询出有多条数据的时候,将返回所有结果。

运行结果

二、描述__slots__属性的作用,并修改读取excel类中保存用例的类

1.限制对象属性,指定指定的slots的属性。
2.节约内存。

class Case:
    __slots__ = ['case_id','title','url','data','excepted']
    
    def __init__(self):
        self.case_id=None
        self.title=None
        self.url=None
        self.data=None
        self.excepted=None

之前学自动化的时候,存数据的3种方法:

1.数据存在列表里面,列表里面里面嵌套字典。
2.数据存在列表里面,列表里面里面嵌套列表。
3.数据存在列表里面,列表里面里面放的是对象。

这个类大量创建对象的时候,每一条用例都要创建一个对象来保存。从一个excel里面读出来几百条用例,就要创建几百个对象。用slots就可以节约内存。

如果单纯读取文件的类,只创建一两个,两三个对象,这个时候没必要用slots了,因为也消耗不了多少内存。只有创建大量对象的时候,加上slots。

三、面向对象的三大特征是什么?多态又是什么?

特征:封装、继承、多态。
多态:指的是一类事物有多种形态,一个抽象类有多个子类,不同的子类对象调用相同的方法,产生不同的执行结果。

多态:指的是一类事物有多种形态,建立在继承的基础上,一个抽象的父类有多个子类,每个子类都具有相同的方法。在函数里只需要指定父类这种类型的对象就行了,传的是哪个子类不用管,只要是这个父类就行了。

在每个子类里面实现不同的方法,通过这个对象调用同一个方法。但是因为传进来的子类不同,子类里面方法的实现又不同,每个方法做的事情不一样。

这个时候传入同一类事物,在这里出现多种表现形式。不同的子类传进来的嘛,从而产生不同的执行结果。

四、私有属性怎么定义,不同的定义方式有什么区别?

单下划线、双下划线开头。
单下划线开头的,对外是公开的,可以直接访问。
双下划线开头的,对外不能直接访问,为了保护这个变量(对外改了一个名字),在原有的属性名前面加了一个_类名。


除标明“图片来自网络”的图片,其它文章中的图片皆为本人所画,计算机知识都一样,如有雷同,纯属巧合。