python学习道路(day8note)(抽象类,类的方法,异常处理,socket编程)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python学习道路(day8note)(抽象类,类的方法,异常处理,socket编程)相关的知识,希望对你有一定的参考价值。
1.#面向对象
#抽象接口 === 抽象类
#就是架构师给你一个架子,你们去写,如果满足不了直接报错
1 #python2 2 print("python2---抽象类".center(20,‘#‘)) 3 import abc #需要在python2中测试,如果直接运行会报错 4 #因为没有调用send方法 5 class Alert(object): 6 ‘‘‘报警基类‘‘‘ 7 __metaclass__ = abc.ABCMeta 8 @abc.abstractmethod 9 def send(self): #特指了 子类必须实现send方法 10 ‘‘‘报警消息发送接口‘‘‘ 11 pass 12 class MailAlert(Alert): #报错函数 13 pass 14 # class MailAlert(Alert): #正确函数 15 # def send(self,msg): 16 # print("-----right---",msg) 17 m = MailAlert() 18 m.send() 19 #m.send(‘hello‘) 20 21 22 print("python3---抽象类".center(20,‘#‘)) 23 class Alert(object): 24 ‘‘‘报警基类‘‘‘ 25 26 def send(self): #特指了 子类必须实现send方法 27 ‘‘‘报警消息发送接口‘‘‘ 28 raise NotImplementedError #主动报错 29 # class MailAlert(Alert): #报错函数 30 # pass 31 class MailAlert(Alert): #正确函数 32 def send(self): 33 print("-----right---") 34 m = MailAlert() 35 m.send()
2.静态方法
1 ): 2 def __init__(self,name): 3 self.name = name 4 def eat(self): 5 print("%s is eating...." % self.name) 6 p = person("alex") 7 p.eat() 8 9 print("转为静态方法".center(20,‘#‘)) 10 #为了解决实例化占用内存,但是到时候会需要考虑一下是不是需要真的真么多实例 11 #静态方法就是不需要实例化 12 class person(object): 13 def __init__(self,name): 14 self.name = name 15 @staticmethod 16 def eat(name,food):#静态方法不能访问公有属性,也不能访问实例 17 print("%s is eating...." % name,food) 18 # p = person("alex") #不需要实例了 19 person.eat("alex","shit")
3.类方法
1 print("类方法".center(20,‘#‘)) 2 class person(object): 3 name = "rain" 4 def __init__(self,name): 5 self.name = name 6 @classmethod #类方法 7 def walk(self): #类方法只能反问类的公有属性不能访问实力属性 8 print("%s is walking.." % self.name) 9 p = person("alex") 10 p.walk() 11 #所以打印出来的是rain在walk
4.属性方法
1 print("属性方法".center(20,‘#‘)) 2 class person(object): 3 name = "rain" 4 def __init__(self,name): 5 self.name = name 6 @property #属性方法的作用是把一个方法变成一个静态属性 7 def talk(self): 8 print("%s is talking.." % self.name) 9 10 @talk.setter 11 def talk(self,msg): 12 print("set msg:",msg) 13 14 @talk.deleter 15 def talk(self): 16 print("delet talk...") 17 18 p = person("alex") 19 p.talk #调用不需要加(),相当于你访问的变量其实是一个方法 读取值 20 p.talk = "hello" #这个赋值变量在调用方法 修改值 21 del p.talk #这个是删除 删除值 22 #作用可以参考航班实例
5.其他方法
1 print("其他方法".center(20,‘#‘)) 2 class person(object): 3 ‘‘‘hahahahahah‘‘‘ 4 def __init__(self,name): 5 self.name = name 6 def tell(self): 7 print("what do you say... %s" % self.name) 8 p = person("jack") 9 p.tell() 10 print(p.__doc__) #打印类的注释打印 hahahahah 11 print(p.__module__) #当前哪个模块 __main__表示当前的某块就在当前 12 print(p.__class__) #当前哪个类 13 14 #***当属性方法航班状态查询加个判断if __name__ == ‘__main__‘: 15 #这样的话在被调用的时候执行了以上的代码,而不被调用一下的调用 16 17 # print("字符串导入模块".center(20,‘#‘)) 18 # from day import 属性方法航班状态查询 19 # mod = __import__(‘day8work.属性方法航班状态查询‘) 20 # print(mod.属性方法航班状态查询.Filght(‘ca980‘))
6.创建类的方法
1 print("meta".center(20,‘#‘)) 2 #普通创建类的方法 3 class Foo(object): 4 def __init__(self, name): 5 self.name = name 6 f = Foo("alex") 7 print(type(f)) #f 由foo foo由 type 生成 8 print(type(Foo)) 9 #特殊方法创建类 10 def talk(self,msg): 11 print("%s is talking:%s" % (self.name,msg)) #里面小括号续加上,不然调用不了 12 def __init__(self,name): 13 self.name = name 14 dog = type(‘dog‘,(object,),{"talk":talk,"__init__":__init__}) 15 print(dog) 16 d = dog("alex") 17 d.talk("eat")
7.异常处理基本机构种类
1 print("异常处理".center(20,‘#‘)) 2 # while True: 3 # try: 4 # a1 = input(‘>>>‘) 5 # a2 = input(‘>>>‘) 6 # a1 = int(a1) 7 # a2 = int(a2) 8 # a3 = a1 + a2 9 # print(a3) 10 # except Exception as e: 11 # # print(e) #e 里面包括的错误信息 12 # print("你输入的错误") 13 #基本结构 14 # try: 15 # 代码块 16 # 代码块 17 # except Exception as e: e 其实就是exception的对象,可以使用其他名称代替 18 # 将错误信息写入日志文件 19 20 #复杂结构 21 # try: 22 # ... 23 # except: 24 # ... 25 # else: 没有错误的时候执行 26 # ... 27 # finally: 正确与否,代码肯定要执行的 28 # ... 29 30 #异常对象 31 try: 32 int(‘fdsfdsf‘) 33 except Exception as e: 34 print(e) #invalid literal for int() with base 10: ‘fdsfdsf‘ 35 36 try: 37 li = [11,22] 38 li[3] 39 except Exception as e: #python内部将错误信息封装到e的对象中,就是exceptino 40 print(e) #list index out of range 41 42 #异常种类 43 #Exception #能将所有的异常都捕获 44 # ... 45 # 其他 只能处理某一种情况 46 # try: 47 # 代码块 48 # 代码块 49 # except ValueErroras e: 50 # 将错误信息写入日志文件 51 # except KeyError as e: 52 # 将错误信息写入日志文件 53 # except Exception as e: 54 # 将错误信息写入日志文件 55 # ValueError 可以替换Exception 56 # KeyError 57 # IOError 58 # IndexError
8.主动触发异常,程序分层
1 #主动触发异常 程序分层 2 try: 3 raise Exception(‘error‘) #主从触发将错误信息封装到e里面 4 except Exception as e: 5 print(e) 6 7 # try: 8 # result = fool() 拿到返回值来判断,就是没有异常,但是邮件没有发送成功 9 # if result: 10 # pass 11 # else: 12 # raise Exception(‘邮件发送失败‘) 13 # foo2() 14 # except Exception as e: 15 # 记录日志
9.断言
1 print("断言".center(20,‘#‘)) 2 #ios 去打开 安卓的app是不是直接就断开了 3 #所以在开始之前先判断,例如系统 4 # assert(关键字) 条件 5 print(1) 6 assert 1==1 # assert 1==2 只显示1并且抛出错误 7 print(2)
10.自定义异常
1 print("自定义异常".center(20,‘#‘)) 2 #开发一个类,来继承exception 来实现满足你自己定义的异常 3 class lilierror(Exception): 4 def __init__(self,msg): 5 self.msg = msg 6 super(lilierror,self).__init__(msg)#执行父类的构造方法 7 try:#如果想要打印出来msg必须加上,不然父类不知道 8 name = ‘alex‘ 9 if name != ‘lili‘: 10 raise lilierror(‘哈哈哈 lili我错了‘) 11 except IndexError as e: 12 print(e) 13 except lilierror as e: 14 print(e,e.msg) #这个就是调用类方法来显示了 15 except Exception as e: 16 print(e,1111) 17 #重点 1 2 3 4 5 断言和自定义异常很少用 基本代码块+主动触发异常
11.反射
1 #反射写法 2 # inp = input("请输入url") #account/login 3 # m,n = inp.split(‘/‘) #m account n login 4 # from dir import app 5 # action = input(‘>>‘) #可以用户输入 6 # # if(hasattr(app,action)): 7 # func =getattr(account,action) 8 # v = getattr(app,action) 9 # result = v() 10 # print(result) 11 12 #getattr() 专以字符串的形式去某个对象中获取指定的属性 13 #hasattr() 以字符串的形式去某个对象中是否含有指定的属性 14 #setattr(容器,名称,值) 以字符串的形式去某个对象中设置指定的属性 15 #delattr() 以字符串的形式去某个对象中删除指定的属性 16 17 # from dir import app 18 # action = input(‘>>‘) #可以用户输入 19 # if(hasattr(app,action)): 20 # func =getattr(account,action) 21 # result = func() 22 # else 23 # result = ‘404‘ 24 # print(result) 25 26 #反射最终版 27 #通过字符串导入模块,可以实现某块/函数 这样的话通过/分割,就可以实现直接调用 28 #module = __import__(‘dir.app‘,formlist=Ture) 这样的话相当于导入模块不加TRUE的话,前面是什么就是什么了 29 # while True: 30 # inp = input("请输入url") 31 # m,n = inp.split(‘/‘) 32 # try: 33 # module = __import__(‘dir.%s‘ % m,fromlist=True) 34 # if hasattr(module,n): 35 # func =getattr(module,n) 36 # result = func() 37 # else: 38 # result = 404 39 # except Exception as e: 40 # result = ‘500‘ 41 # print(result)
12.socket编程
1 #socket osi 七层 tcp 三次握手 2 #服务器端 3 #socket.socket(AF_INET,SOCK_STREAM) 先创建sock实例 4 #server.bind(‘0.0.0.0‘,8000) 监听Ip端口 5 #server.listen(5) 可以多个并列 6 #server.accept() 接收请求 7 #conn(建立链接),client_addr(地址) = server.accept() 8 #conn.send() 发送消息 9 #conn.recv() 接收消息 10 #server.close() 11 #server.send() 12 13 #客户端 14 # socket.socket(AF_INET,SOCK_STREAM) 15 # client.connect() 16 # client.send()
12.socket编程 c s架构
client 端的代码量
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 # import socket 5 # client = socket.socket() 6 # client.connect(("localhost",9998)) 7 # while True: 8 # msg = input(">>:").strip() 9 # if len(msg) == 0: continue 10 # client.send(msg.encode("utf-8")) 11 # data = client.recv(1024) 12 # print("来自服务器:", data) 13 # client.close() 14 15 16 #基本结构 17 # import socket 18 # client = socket.socket() 19 # client.connect((‘localhost‘,8000)) 20 # client.send(b‘hello‘) 21 # date = client.recv(1024) 22 # print(date) 23 24 # 25 # #循环收发 26 # import socket 27 # client = socket.socket() 28 # client.connect((‘localhost‘,8000)) 29 # while True: 30 # client.send(b‘hello‘) 31 # date = client.recv(1024) 32 # print(date) 33 34 35 #单循环客户发送信息 36 # import socket 37 # client = socket.socket() 38 # client.connect((‘localhost‘,8000)) 39 # while True: 40 # msg = input(‘>>>:‘).strip() 41 # if len(msg) == 0: continue 42 # client.send(msg.encode()) 43 # date = client.recv(1024) 44 # print(‘laizisever‘,date) 45 46 47 #排列链接 48 # import socket 49 # client = socket.socket() 50 # client.connect((‘localhost‘,8000)) 51 # while True: 52 # msg = input(‘>>>:‘).strip() 53 # if len(msg) == 0: continue 54 # client.send(msg.encode()) 55 # date = client.recv(1024) 56 # print(‘laizisever‘,date) 57 # 58 59 #调用Linux系统命令实现ssh top -bn 1 60 # import socket 61 # client = socket.socket() 62 # client.connect((‘10.10.10.140‘,8002)) 63 # while True: 64 # msg = input(‘>>>:‘).strip() 65 # if len(msg) == 0: continue 66 # print(‘to server‘, msg) 67 # client.send(msg.encode()) 68 # date = client.recv(1024) 69 # print(date.decode()) 70 71 72 #调用Linux系统命令实现ssh top -bn 1 将接收大文件数据 73 import socket 74 client = socket.socket() 75 client.connect((‘10.10.10.140‘,8002)) 76 while True: 77 msg = input(‘>>>:‘).strip() 78 if len(msg) == 0: continue 79 print(‘to server‘, msg) 80 client.send(msg.encode()) 81 date = client.recv(1024) 82 print("res:",date.decode()) 83 total_size = int(date.decode()) 84 recevied_size = 0 85 res = b‘‘ 86 while recevied_size < total_size: 87 d = client.recv(1024) 88 res += d 89 90 recevied_size += len(d) 91 print("rece done----") 92 print(res.decode())
server 端的代码量
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 5 # import socket 6 # server = socket.socket() #获得socket实例 7 # 8 # server.bind(("localhost",9998)) #绑定ip port 9 # server.listen() #开始监听 10 # print("等待客户端的连接...") 11 # conn,addr = server.accept() #接受并建立与客户端的连接,程序在此处开始阻塞,只到有客户端连接进来... 12 # print("新连接:",addr ) 13 # while True: 14 # data = conn.recv(1024) 15 # print("收到消息:",data) 16 # conn.send(b"server") 17 # server.close() 18 19 20 #基本结构 21 # import socket 22 # server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 23 # server.bind((‘0.0.0.0‘,8000)) 24 # server.listen(5) 25 # # print("hahahahaha") 26 # conn,client_addr = server.accept() 27 # print(conn,client_addr) 28 # date = conn.recv(1024) 29 # conn.send(b‘woshisever‘) 30 # print(date) 31 32 # #循环收发 33 # import socket 34 # server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 35 # server.bind((‘0.0.0.0‘,8000)) 36 # server.listen(5) 37 # conn,client_addr = server.accept() 38 # 39 # while True: 40 # date = conn.recv(1024) 41 # print(‘shoudao client‘,date) 42 # conn.send(b‘woshisever‘) 43 44 45 46 #单循环收发客户端信息 47 # import socket 48 # server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 49 # server.bind((‘0.0.0.0‘,8000)) 50 # server.listen(5) 51 # conn,client_addr = server.accept() 52 # 53 # while True: 54 # date = conn.recv(1024) 55 # print(‘shoudao client‘,date) 56 # conn.send(b‘woshisever‘) 57 58 59 #排列链接,当一个断块,另一个可以链接 60 # import socket 61 # server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 62 # server.bind((‘0.0.0.0‘,8000)) 63 # server.listen(5) 64 # 65 # while True: 66 # conn,client_addr = server.accept() 67 # 68 # while True: 69 # try: 70 # date = conn.recv(1024) 71 # print(‘shoudao client‘,date) 72 # conn.send(b‘woshisever‘) 73 # except ConnectionResetError as e: 74 # print(e) 75 # break 76 77 78 #调用Linux系统命令实现ssh 79 # import socket 80 # import subprocess 81 # server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 82 # server.bind(("0.0.0.0",8002)) 83 # server.listen(5) 84 # print("--------listen-----------") 85 # 86 # while True: 87 # conn,client_addr = server.accept() 88 # while True: 89 # date = conn.recv(1024) 90 # print("recv from cli:",date) 91 # res = subprocess.Popen(date,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) 92 # conn.send(res.stdout.read()) 93 94 95 #调用Linux系统命令实现ssh 实现大数据返回消息 96 # import socket 97 # import subprocess 98 # server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 99 # server.bind(("0.0.0.0",8002)) 100 # server.listen(5) 101 # print("--------listen-----------") 102 # 103 # while True: 104 # conn,client_addr = server.accept() 105 # while True: 106 # date = conn.recv(1024) 107 # print("recv from cli:",date) 108 # res_obj = subprocess.Popen(date,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) 109 # res = res_obj.stdout.read() 110 # conn.send(str(len(res)).encode()) 111 # conn.send(res)
以上是关于python学习道路(day8note)(抽象类,类的方法,异常处理,socket编程)的主要内容,如果未能解决你的问题,请参考以下文章
PHP接口(interface)和抽象类(abstract)的区别