2、基础知识点回顾

`# 一、Python中的魔法方法

__init__:类实例化时触发
__str__:打印对象时触发
__call__:对象()触发,类也是对象,如果是类(),则是类的实例化过程对用元类的__call__
__new__:在类实例化对象时触发,但时在__init__之前先触发
__del__:del对象在对象回收时触发
__setattr__,__getttr__:(.拦截方法),当对象.属性赋值时,会调用setattr
									当对象.属性取值时,会调用getattr
__getitem__,__setitem__:([]拦截),当对象[]属性赋值时,会调用setitem
								   当对象[]属性取值时,会调用getitem
__enter__和__exit__:上下管理器

二、setattr、getattr、setitem、getitem的演示

​ 在函数的使用中,可以使用setattr、getattr进行使用.属性的方式进行赋值或者取值

​ 使用setitem、getitem进行使用[]实用性的方式进行赋值或者取值

​ 取值的时候需要使用return,将值保存,

​ 使用反射可以进行判断是否正确

class Person:
    def __init__(self,name):
        self.name = name
    def __setitem__(self, key, value):
        setattr(self,key,value)     #反射
    def __getitem__(self, item):
        return getattr(self,item)   #反射取值
p = Person('a')
p.name = 'ppp'
p['name'] = 10

print(p.name)
print(p['name'])
dic = {'name':'a','age':19}

class Mydic(dict):
    def __setattr__(self, key, value):
        print('对象加点赋值,会触发我')
        self[key]=value
    def __getattr__(self, item):
        print("对象加点取值会触发我")
        return self[item]
mydic = Mydic(name='b',age=1)
print(mydic['name'])     #可以使用mydic[]取值,但是无法进行触发
print(mydic.name)	使用内置getattr取值,需要返回一个return
mydic.name=99	使用内置setattr进行赋值
print(mydic.name)

三、上下文管理器

​ 上下管理器即使用,with as 在执行的时候会触发__enter__,而在with结束的时候会触发__exit__,进行自动管理

class Person:
    def __enter__(self):
        print('进入with管理时触发')
        print('进入with语句块时执行')
        return 'oo'
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('退出with时执行')
        print('1', exc_type)
        print('2', exc_val)
        print('3', exc_tb)
with Person() as p:
    print(p)

四、eq

​ 当执行==时,切来那边都是对象时就会触发,不是对象无法比较,会直接报错,

​ 第二个对象会传入__eq__中

class A:
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def __eq__(self, obj):
        print(obj.x)	#打印出第二个对象的值
        if self.x+self.y == obj.x+obj.y:
            return True
        else:
            return False
a = A(1,2)
b = A(2,1)
print(a==b)	当执行==时,会触发__eq__的执行,并且把b传递到eq中,也就是object,==后只要是对象,就可以传进去

五、cookie、session、token

5.1、相关介绍

HTTP协议:无状态,无连接,给予请求响应,给予tcp/ip,应用于协议层

mysql:c/s架构:底层基于socket,自己封装的协议,

​ MySQL的客户端:navcate(c++图形化界面,实现了请求和响应)

​ pymysql(基于Python语言实现了请求和响应)

redis:c/s架构,基于socket,自己封装的协议

docker:c/s架构,基于HTTP协议,使用restfull规范

elasticsearch:c/s架构,基于HTTP协议,使用restfull规范

5.2、名词介绍

cookie:是存在于浏览器的键值对,向服务器发送请求,携带他过去(比较不安全)

session:是存在于服务器的键值对,放置在内存、文件、MySQL、redis中,都可以

​ 缺点是:如果用户量比较大,存储需要消耗大量的服务器资源

token:就是个字符串(即安全,又可以存个人信息),在个人信息的基础上加密字符串,

​ token的使用现在比较广泛,契合了前后端分离

六、异常处理

​ try:防止有可能出现异常的代码

​ except:出现异常时,反馈的信息,并且可以区分不同类型的异常分类

​ else:显示未出现异常时,需要反馈的信息

​ finally:无论是否有异常都会直接执行

try:
except   :
finally:
else:  什么时候执行


try:
    print("xxx")
    # print(1/0)
except Exception as e:
    print(e)
else:  # 基本上不会用到
    print("正常执行,没有出异常,会走")
finally:
    print("我是finally")   # 用于会走,无论是否有异常

七、pymysql的使用

import pymysql


#连接数据库
conn=pymysql.connect(host='101.133.225.166', user='root', password="123456",database='test', port=3306) #
# 获取游标
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) # 查出来数据是字典格式
# 操作 定义一个sql
# sql='select id,name from book'
# cursor.execute(sql)
# ret=cursor.fetchall()
# print(ret)
# 插入
# sql='insert into book(id,name) values (%s,%s)'
# cursor.execute(sql,[3,'lqz'])
# conn.commit()

# 删除
# sql='delete from book where name=%s'
# cursor.execute(sql,['lqz'])
# conn.commit()

# 更新
# sql='update book set name=%s where id=%s'
# cursor.execute(sql,['xxx',1])
# conn.commit()

`

posted @ 2020-07-02 09:52  疏星淡月  阅读(112)  评论(0编辑  收藏  举报