面向对象
类(class):描述具有相同属性和行为的对象的集合。比如学生类(学号、姓名、班级、学习)
对象(object):通过类定义的数据结构的实例,是对类的具体实现
属性:描述类的静态特征
类属性:每一个对象都有并且值相同,比如学生的国籍
实例属性:每一个对象都具有,但是值可能不同,比如学生姓名、年龄等。
方法:用于描述类的动态行为
类方法:通过装饰器@classmethod声明,常通过类调用,一般用于修改类属性的值
实例方法:类中最常用的方法,常通过对象调用。
静态方法:通过装饰器@staticmethod声明,常通过类调用,一般用于和类本身无关的方法。
声明:
class 类名[(父类1,父类2,...)]:
语句1
......
语句n
类名:符合标识符命名规范,通常每个单词首字母大写
例:声明一个学生类
属性:学号、姓名、年龄、国籍、班级
方法:学习、吃饭、睡觉
对象的声明(实例化)
语法:对象名=类名([实参1,实参2,....])
例:实例化Student类
内置方法
__new__(),new方法,用于创建对象,在实例化时自动调用
__init__(),构造方法,初始化对象,在实例化时自动调用
__del__(),析构方法,销毁对象,在对象声明周期结束时自动调用
例:
例:
对象组合
用于描述类与类之间的关系,多个类之间存在依赖关系,需要在A类中调用B的属性或方法。
方式
1.在A类的实例方法中传入B类的对象,通过该对象调用B类中的属性和方法(A类和B类相互依赖)
2.在A类的构造方法中传入B类的对象,通过该对象调用B类中的属性和方法(A类依赖于B类)
面向对象的三大特性:
1.封装:
私有化:在属性或者方法名前面加2条下划线,此时属性或者方法就变为私有的,只能在当前类的内部访问,但提供与外界的接口进行数据的交换。
2.继承
作用:提高代码重用性,降低代码冗余
基本概念:
子类:继承其他类的类;可以有多个父类;可以继承父类所有非私有的属性和方法。
父类:也叫做基类、超类,被别的类继承的类
重写:子类继承了父类的方法,在子类中对这个方法重新实现该方法
例1:继承
例2:父类控制子类必须重写方法
单例模式:在程序运行期间保证类的实例只有1个
例3
Ture
无论实例化多少次,占据的空间都是同一个。
3.多态
多线程
线程:进程内部进行CPU调度的基本单位,一个进程中至少存在一个线程
模块:threading
创建线程:Thread(target=func[args=(value1,value2,...)])
target,指定线程需要执行的任务(通常是函数名或者方法名,不要加括号)
args,指定线程执行的任务需要传入的实参,以元组的形式传入
启动线程:start()方法
包括一个主线程,两个子线程,属于下列三种中的第一种。
有三种情况
1.主线程在子线程结束前先结束
2.主线程结束,子线程跟随主线程结束而结束
3.主线程在子线程结束后结束
线程守护(第二种情况):
作用:子线程跟随主线程结束而结束
方法:satDaemon(True),必须在线程启动前设置
线程阻塞(第三种情况):
作用:主线程在子线程结束后结束
方法:join(),需要在线程启动后设置
线程锁
作用:解决子线程共享全局变量时出现的数据冲突问题,从而确保数据的安全性和准确性
缺点:降低程序运行效率
方法一:
使用步骤
1.创建锁:
lock=threading.lock()
2.在编辑全局变量之前获取锁,锁定全局变量只能由当前子线程编辑:
lock.acquire()
3.编辑完成后,释放锁(一定记得释放锁)
lock.release()
方法二:with lock() 实现自动释放锁