Class20:初学面向对象、多线程

    技术2022-07-11  84

    面向对象的设计和实现

    一、定义和实现 对象 可以直接对应现实世界里面的事物

    二、面向对象的设计(OOD)

    1、分析要解决的现实世界的问题

    2、定义出各种对象 代表现实世界的对象

    3、通过设计 对象之间的关系和交互行为来设计系统

     

    三、因为

    1、现实世界 其实就是各种对象 和对象之间的关系、交互行为

    2、现实世界:事物的时间

    a、物:对象、对象之间的关系(儿子、父亲;老板、员工)

    b、事:对象之间的交互(司机开车,厨师做饭)

    3、这种设计方式 更容易被人所理解和接受

    类和实例

    1、首先,寻找要设计的对象

    老虎、羊、房间

    2、接下来,确定对象的定义

    a、对象的定义:定义对象在这个系统里面的的属性和行为

    b、比如老虎这类对象,在这个系统里面的共有属性,行为 属性

    c、在面向对象的软件设计中把对象和它的属性和行为的定义叫 类 的定义

    d、类表示了这类对象所共有的属性和行为

    e、类是面向对象的设计中最基本的概念

    f、定义了类,就定义了对象的类型(包括在系统里面的属性和行为)

    #定义类:使用class,建议类名首字母大写,命名规则和变量基本一致。#如果要操作实例属性则定义为实例方法,不操作实例属性则定义为静态方法class Tiger():    #静态属性:    classname = '老虎'     #实例方法,初始化方法init就是实例方法def __init__(self,weight=200):        #实例属性,每个实例所独有的属性        self.weight = weight    #静态方法,静态方法可以调用静态属性    def tiger_sleep(self):        #静态属性,所共有的属性,指所有老虎        print(Tiger.classname)    #类的实例化,t1,t2特指某个老虎t1 = Tiger()                t2 = Tiger()#访问t1的静态属性print(t1.classname) #访问t1的实例属性print(t1.weight)     # 访问实例方法print(t1.rorw())# 访问静态方法print(t1.tiger_sleep())

    3、实例 是类的具体化存在

    a、老虎这个类,描述了:

    1、在这个系统里面共有的属性:体重、名称2、行为有叫、吃食物

    b、每个具体的老虎,是老虎这个类的实例    房间中老虎c、类的实例的关系,有点像模具和根据模具做的东西一样

    面向对象的语言 vs 面向对象的设计

    1、面向对象的设计:是一种设计思路

    2、面向对象的语言:提供对面向对象设计的语言支持

    3、非面向对象的语言也能实现面向对象的设计思路

     

    静态属性和实例属性

    1、静态属性(类属性)

    该类的所有实例共享的属性

    2、实例属性

    体重(每个实例独有的)

    定义在 初始化方法 __init__里

    self的概念

    静态方法和实例方法

    1、对象的方法就是描述对象行为的

    a、通过定义在类里面的函数

    b、初始化方法init函数

    2、类的方法包括

    a、实例方法:每个具体实例相关的方法

    b、静态方法:共有的方法,每个具体实例都是相同的

    实例方法:

    1、与每个具体实例相关的方法

    如果代码中的实例方法不访问任何实例属性,一般建议实现为静态方法

    2、初始化方法就是一个实例方法

    3、一般实例方法都要访问self

    静态方法

    与每个具体实例无关

    @staticmethod 修饰 (装饰器)

    静态方法不能访问实例属性,但是可以访问静态属性

     

    对象的组合

    什么是对象的组合?

    1、房间里可以包含老虎、羊

    2、通过对象的属性表示这种组合关系的

    在类定义的 初始化函数 里面表示对象的组合class Room:def __init__(self,num,animal):   self.num = num   self.animal = animal

     

    对象的继承

    #定义父类class Tiger:    classname = 'tiger'    def __init__(self,weight=100):        self.weight = weight    def roar(self):        print('wow!!!')        self.weight -= 5        return self.weight    def feed(self,food):        if food == 'meat':            self.weight += 10            print('good, weight + 10')        else :            self.weight -= 10            print('bad, weight - 10')#定义子类class NeTiger(Tiger):    #重新定义静态属性    color = 'yellow white'    classname = 'northeast tiger'#重新定义实例方法    def __init__(self,weight=200):        Tiger.__init__(self,weight)    def roar(self):        print('wow!!! wow!!! wow!!!')        self.weight -= 5    @staticmethod       #静态方法 类或实例均可调用    def jump():        print('3 meters high')#定义子类class ScTiger(Tiger):    color = 'brown black'    def __init__(self,weight=200):        Tiger.__init__(self,weight)    @staticmethod    def jump():        print('2 meters high')#实例tiger = Tiger()print(tiger.weight)neTiger = NeTiger()print(neTiger.weight)scTiger = ScTiger()print('---- 先看看东北虎 -----')neTiger.roar()neTiger.jump()print(neTiger.classname)print('---- 再看看华南虎 -----')scTiger.roar()scTiger.jump()print('---- 再看看老虎 -----')print(tiger.roar())print(scTiger.classname)

    同样的的方法调用,在不容类型的对象上会表现出不同的特性,称之为多态

     

    补充知识点

    随机出现1到10任意一个数字

    from random import randint

    a = randint(1,10)

    print(a)

     

    1970年到目前经过的秒数总和

    import time

    print(time.time())

    多线程

    print("**************主线程开始**********************")import threadingimport timedef fun1(a,b):     print("********fun1子线程开始*************")     print("hello",a+b)     print("********fun1子线程结束*************")def fun2(a,b):     print("********fun2子线程开始*************")     print("hello",a+b)     print("********fun2子线程结束*************")#两个参数、一个是指定线程的入口函数。另一个是函数的传入的值t1 = threading.Thread(target=fun1,args=(3,4))t2 = threading.Thread(target=fun2,args=(5,4))#启动线程t2.start()t1.start()#join,让主线程等待子线程执行结束之后再执行t1.join()t2.join()print("**************主线程结束**********************")

     

    Python操作共享数据import threadingimport timezhifutong = {     'kunkun':1000,     'luhan':2000}#申请锁zhifu_lock = threading.Lock()def zhifu(username,t):     #加锁    zhifu_lock.acquire()     #获取当前余额    zhifutong[username] -= t     print(f"{username}账户余额为:{zhifutong[username]}")     #释放锁    zhifu_lock.release()def yuebao(username,t):     zhifu_lock.acquire()     #获取当前余额    zhifutong[username] += t     print(f"{username}账户余额为:{zhifutong[username]}")    zhifu_lock.release()t1 = threading.Thread(target=zhifu,args=('kunkun',100))t2 = threading.Thread(target=yuebao,args=('kunkun',200))#启动线程t1.start()t2.start()#设置等待t1.join()t2.join()print(zhifutong['kunkun'])

     

    左对齐、右对齐、居中s1 = "helloword"s2 = "hello" 方式一:print('%-30s' % s1)print('%-30s' % s2) 方式二: print('{:^30}'.format(s1)) print('{:^30}'.format(s2)) 方式三: 右对齐print(s1.rjust(30))print(s2.ljust(30))print(s2.center(20))

     

    练习题1

    题目二:# 打开文件,文件中记录了人的姓名和年龄,请编写一个程序,将其中年龄大于50岁的人找出来,并且以如下格式追加到文件末尾中。## 格式如下:# 大于50岁的人有:xxx,xxx,xxxwith open('userinfo.txt','a+',encoding='utf-8') as a:     #a+模式打开文件,指针在文件末尾,需要移动到文件开头    a.seek(0)     #读取成一个字符串    usertext = a.read()     #保存处理后的结果    user_list_info = []     #根据换行符来切割,成列表然后遍历    for one in usertext.splitlines():         if one.strip() == '':             continue        else:             #根据:切割,然后是去掉空格然后比较年龄大小            name,age = one.split(':')             if int(age.strip()) > 50 :                 user_list_info.append(name.strip())     #将列表转换为字符串,中间用逗号隔开    b = ','.join(user_list_info)    a.write(f'\n\n\n大于50岁的人有:{b}')c

     

    练习题2

     1. 创建一个新的列表newList# 2. 先找出所有元素中最小的,appendnewList里面# 3. 再找出剩余的所有元素中最小的,appendnewList里面# 4. 依次类推,直到所有的元素都放到newList里面list1 = []def mySort(listname):     newList = []     for one in len(listname):        list_min = min(listname)       newList.append(list_min)       listname.remove(list_min)     return newList

    练习题3

    现有文件1(如下,请保存到文件file1.txt中), 记录了公司员工的薪资,其内容格式如下name: Jack   ;    salary:  12000  name :Mike ; salary:  12300name: Luk ;   salary:  10030   name :Tim ;  salary:   9000name: John ;    salary:  12000name: Lisa ;    salary:   11000每个员工一行,记录了员工的姓名和薪资,每行记录 原始文件中并不对齐,中间有或多或少的空格现要求实现一个python程序,计算出所有员工的税后工资(薪资的90%)和扣税明细,以如下格式存入新的文件 file2.txt中,如下所示name: Jack   ;    salary:  12000 ;  tax: 1200 ; income:  10800name: Mike   ;    salary:  12300 ;  tax: 1230 ; income:  11070name: Luk    ;    salary:  10030 ;  tax: 1003 ; income:   9027name: Tim    ;    salary:   9000 ;  tax:  900 ; income:   8100name: John   ;    salary:  12000 ;  tax: 1200 ; income:  10800name: Lisa   ;    salary:  11000 ;  tax: 1100 ; income:   9900要求像上面一样的对齐tax 表示扣税金额和 income表示实际收入。注意扣税金额和 实际收入要取整数  with open('file1.txt',encoding='utf-8') as a,open('file3.txt','w') as b:     a_txt = a.read()     for one in a_txt.splitlines():         #name        name = one.split(";")[0].split(':')[1].strip()         #取薪资        salary = one.split(";")[1].split(':')[1].strip()         #计算税后薪资和税收        income = int(salary) * 0.9         tax =  int(salary) - income        b.write('name:{:<10};    salary:{:>10};  tax:{:^10}; income:{:>10}\n'.format(name,int(salary),tax,income))

     

    练习题4

    大家自学requests库,官方文档如下(http://cn.python-requests.org/zh_CN/latest/),然后使用其中的方法,将如下两个网址内容爬取回来,使用python文件读写的内容,写入到名为filetest.txt的文本文档中;注意在爬取网址内容的方法写出函数,方便重复调用;

     

    网址一:http://mirrors.aliyun.com/centos/7/isos/x86_64/0_README.txt

    网址二:http://mirrors.aliyun.com/centos/7/isos/x86_64/sha256sum.txt

     

    import threadingimport requests#url放在列表中urls = ['http://mirrors.aliyun.com/centos/7/isos/x86_64/0_README.txt', 'http://mirrors.aliyun.com/centos/7/isos/x86_64/sha256sum.txt']# 存放的文本内容text_list = []def gat_text(url):     r = requests.get(url)    text_list.append(r.text)for url in urls:     t1 = threading.Thread(target=gat_text,args=(url,))    t1.start()    t1.join()print(text_list)with open('filetest.txt', 'a+') as a:      for one in text_list:          a.write(one)

     

    Processed: 0.014, SQL: 9