一、面向对象
面向对象编程(Object-oriented Programming,简称 OOP),是一种封装代码的方法。数据和对数据的操作封装在一起组成类,通过类来创建对象,通过对象之间的交互来实现程序的功能。所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。
类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
对象(object):通过类定义的数据结构的实例,是对类的具体表现;对象包括两个数据成员(类变量和实例变量)和方法。
属性:描述类的静态特征;
类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
方法:描述类的动态行为,类中定义的函数。
类方法:通过装饰器@classmethod声明,常通过类调用,一般用于修改类属性的值。
实例方法:使每一个对象都具有的,通过对象调用;
静态方法:通过装饰器@staticmethod声明,常通过类调用
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
实例化:创建一个类的实例,类的具体对象。
class Student:
#类属性,学生总数
number = 0
#构造函数,创建对象是调用 ;
def __init__(self,name,age):
self.age = age
self.name=name
#每创建一个学生,人数增加一
Student.number = Student.number+1
def study(self):
print(self.name," studying!!")
def stuAge(self):
print(self.age)
#静态方法,处理类属性
@classmethod
def stu_Number(cls):
print('student number is : ',cls.number)
#析构函数,退出销毁对象
def __del__(self):
Student.number = Student.number-1
print('student number is : ', Student.number)
if __name__=='__main__':
stu = Student('lijian',31)
stu.stuAge()
stu.study()
stu.stu_Number()
二、多线程
线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。 线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源。
优点:1、使用线程可以把占据长时间的程序中的任务放到后台去处理。2、用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。3、程序的运行速度可能加快。4、在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
示例代码:Python实现多线程编程要用到 threading 模块中的 Thread 类。语法:
#创建线程 thread(target=func[args=(value1,value2,.....)]) function - 线程函数名。 args - 传递给线程函数的参数,他必须是个tuple元组类型。 #启动线程 start()
import threading
import time
def func1():
for i in range(10):
print('func1 . ')
time.sleep(0.2)
print('n')
def func2():
for i in range(10):
print('func2 . ')
time.sleep(0.2)
print('n')
if __name__ == '__main__':
#当脚本跑起来一共有三个线程;主线程(脚本本身)和子线程1/2
thread1 = threading.Thread(target=func1) #子线程1
thread2 = threading.Thread(target=func2) #子线程2
#线程守护,线程随主线程结束而结束;
# thread1.setDaemon()
# thread1.setDaemon()
thread1.start()
thread2.start()
#阻塞线程,主线程在子线程结束后再结束
thread1.join()
thread2.join()
线程守护:让子线程随主线程结束而结束;需要在子线程启动前设置;调用方法 setDaemon(True)
线程阻塞:让主线程在子线程结束后再结束;需要在子线程 启动后设置;调用join() 方法。
线程同步:如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。使用Thread对象的Lock和Rlock可以实现简单的线程同步,这两个对象都有acquire方法和release方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到acquire和release方法之间。
#创建锁 threadLock = threading.Lock() # 获得锁,成功获得锁定后返回True # 可选的timeout参数不填时将一直阻塞直到获得锁定 # 否则超时后将返回False threadLock.acquire() #执行语句 print(num) # 释放锁 threadLock.release()



