python学习道路(day8note)(抽象类,类的方法,异常处理,socket编程)

时间:2022-09-05 19:08:26
1.#面向对象
#抽象接口 === 抽象类
#就是架构师给你一个架子,你们去写,如果满足不了直接报错
 #python2
 print("python2---抽象类".center(20,'#'))
 import abc    #需要在python2中测试,如果直接运行会报错
 #因为没有调用send方法
 class Alert(object):
     '''报警基类'''
     __metaclass__ = abc.ABCMeta
     @abc.abstractmethod
     def send(self):   #特指了 子类必须实现send方法
         '''报警消息发送接口'''
         pass
 class MailAlert(Alert):  #报错函数
     pass
 # class MailAlert(Alert):  #正确函数
 #     def send(self,msg):
 #         print("-----right---",msg)
 m = MailAlert()
 m.send()
 #m.send('hello')

 print("python3---抽象类".center(20,'#'))
 class Alert(object):
     '''报警基类'''

     def send(self):   #特指了 子类必须实现send方法
         '''报警消息发送接口'''
         raise NotImplementedError  #主动报错
 # class MailAlert(Alert):  #报错函数
 #     pass
 class MailAlert(Alert):  #正确函数
     def send(self):
         print("-----right---")
 m = MailAlert()
 m.send()

2.静态方法

 ):
     def __init__(self,name):
         self.name = name
     def eat(self):
         print("%s is eating...." % self.name)
 p = person("alex")
 p.eat()

 print("转为静态方法".center(20,'#'))
 #为了解决实例化占用内存,但是到时候会需要考虑一下是不是需要真的真么多实例
 #静态方法就是不需要实例化
 class person(object):
     def __init__(self,name):
         self.name = name
     @staticmethod
     def eat(name,food):#静态方法不能访问公有属性,也不能访问实例
         print("%s is eating...." % name,food)
 # p = person("alex") #不需要实例了
 person.eat("alex","shit")

3.类方法

 print("类方法".center(20,'#'))
 class person(object):
     name = "rain"
     def __init__(self,name):
         self.name = name
     @classmethod  #类方法
     def walk(self): #类方法只能反问类的公有属性不能访问实力属性
         print("%s is walking.." % self.name)
 p = person("alex")
 p.walk()
 #所以打印出来的是rain在walk

4.属性方法

 print("属性方法".center(20,'#'))
 class person(object):
     name = "rain"
     def __init__(self,name):
         self.name = name
     @property  #属性方法的作用是把一个方法变成一个静态属性
     def talk(self):
         print("%s is talking.." % self.name)

     @talk.setter
     def talk(self,msg):
         print("set msg:",msg)

     @talk.deleter
     def talk(self):
         print("delet talk...")

 p = person("alex")
 p.talk #调用不需要加(),相当于你访问的变量其实是一个方法 读取值
 p.talk = "hello" #这个赋值变量在调用方法 修改值
 del p.talk #这个是删除 删除值
 #作用可以参考航班实例

5.其他方法

 print("其他方法".center(20,'#'))
 class person(object):
     '''hahahahahah'''
     def __init__(self,name):
         self.name = name
     def tell(self):
         print("what do you say... %s" % self.name)
 p = person("jack")
 p.tell()
 print(p.__doc__) #打印类的注释打印  hahahahah
 print(p.__module__) #当前哪个模块  __main__表示当前的某块就在当前
 print(p.__class__) #当前哪个类

 #***当属性方法航班状态查询加个判断if __name__ == '__main__':
 #这样的话在被调用的时候执行了以上的代码,而不被调用一下的调用

 # print("字符串导入模块".center(20,'#'))
 # from day import 属性方法航班状态查询
 # mod = __import__('day8work.属性方法航班状态查询')
 # print(mod.属性方法航班状态查询.Filght('ca980'))

6.创建类的方法

 print("meta".center(20,'#'))
 #普通创建类的方法
 class Foo(object):
     def __init__(self, name):
         self.name = name
 f = Foo("alex")
 print(type(f)) #f 由foo  foo由 type  生成
 print(type(Foo))
 #特殊方法创建类
 def talk(self,msg):
     print("%s is talking:%s" % (self.name,msg)) #里面小括号续加上,不然调用不了
 def __init__(self,name):
     self.name = name
 dog = type('dog',(object,),{"talk":talk,"__init__":__init__})
 print(dog)
 d = dog("alex")
 d.talk("eat")

7.异常处理基本机构种类

 print("异常处理".center(20,'#'))
 # while True:
 #     try:
 #         a1 = input('>>>')
 #         a2 = input('>>>')
 #         a1 = int(a1)
 #         a2 = int(a2)
 #         a3 = a1 + a2
 #         print(a3)
 #     except Exception as e:
 #         # print(e) #e 里面包括的错误信息
 #         print("你输入的错误")
 #基本结构
 # try:
 #     代码块
 #     代码块
 # except Exception as e:  e 其实就是exception的对象,可以使用其他名称代替
 #     将错误信息写入日志文件

 #复杂结构
 # try:
 #     ...
 # except:
 #     ...
 # else: 没有错误的时候执行
 #     ...
 # finally:  正确与否,代码肯定要执行的
 #     ...

 #异常对象
 try:
     int('fdsfdsf')
 except Exception as e:
     print(e)   #invalid literal for int() with base 10: 'fdsfdsf'

 try:
     li = [11,22]
     li[3]
 except Exception as e: #python内部将错误信息封装到e的对象中,就是exceptino
     print(e) #list index out of range

 #异常种类
 #Exception #能将所有的异常都捕获
 # ...
 # 其他     只能处理某一种情况
 # try:
 #     代码块
 #     代码块
 # except ValueErroras e:
 #     将错误信息写入日志文件
 # except KeyError as e:
 #     将错误信息写入日志文件
 # except Exception as e:
 #     将错误信息写入日志文件
 # ValueError  可以替换Exception
 # KeyError
 # IOError
 # IndexError

8.主动触发异常,程序分层

 #主动触发异常  程序分层
 try:
     raise Exception('error') #主从触发将错误信息封装到e里面
 except Exception as e:
     print(e)

 # try:
 #     result = fool()    拿到返回值来判断,就是没有异常,但是邮件没有发送成功
 #     if result:
 #         pass
 #     else:
 #         raise Exception('邮件发送失败')
 #     foo2()
 # except Exception as e:
 #     记录日志

9.断言

 print("断言".center(20,'#'))
 #ios 去打开 安卓的app是不是直接就断开了
 #所以在开始之前先判断,例如系统
 # assert(关键字) 条件
 print(1)
 assert 1==1   # assert 1==2  只显示1并且抛出错误
 print(2)

10.自定义异常

 print("自定义异常".center(20,'#'))
 #开发一个类,来继承exception 来实现满足你自己定义的异常
 class lilierror(Exception):
     def __init__(self,msg):
         self.msg = msg
         super(lilierror,self).__init__(msg)#执行父类的构造方法
 try:#如果想要打印出来msg必须加上,不然父类不知道
     name = 'alex'
     if name != 'lili':
         raise lilierror('哈哈哈 lili我错了')
 except IndexError as e:
     print(e)
 except lilierror as e:
     print(e,e.msg)  #这个就是调用类方法来显示了
 except Exception as e:
     print(e,1111)
 #重点  1 2 3 4 5  断言和自定义异常很少用  基本代码块+主动触发异常

11.反射

 #反射写法
 # inp = input("请输入url")     #account/login
 # m,n = inp.split('/')  #m account  n login
 # from  dir import app
 # action = input('>>')  #可以用户输入
 # # if(hasattr(app,action)):
 #     func =getattr(account,action)
 # v = getattr(app,action)
 # result = v()
 # print(result)

 #getattr() 专以字符串的形式去某个对象中获取指定的属性
 #hasattr() 以字符串的形式去某个对象中是否含有指定的属性
 #setattr(容器,名称,值) 以字符串的形式去某个对象中设置指定的属性
 #delattr() 以字符串的形式去某个对象中删除指定的属性

 # from  dir import app
 # action = input('>>')  #可以用户输入
 # if(hasattr(app,action)):
 #     func =getattr(account,action)
 #     result = func()
 #     else
 #     result = '404'
 #     print(result)

 #反射最终版
 #通过字符串导入模块,可以实现某块/函数  这样的话通过/分割,就可以实现直接调用
 #module = __import__('dir.app',formlist=Ture)  这样的话相当于导入模块不加TRUE的话,前面是什么就是什么了
 # while True:
 #     inp = input("请输入url")
 #     m,n = inp.split('/')
 #     try:
 #         module = __import__('dir.%s' % m,fromlist=True)
 #         if hasattr(module,n):
 #             func =getattr(module,n)
 #             result = func()
 #         else:
 #             result = 404
 #     except Exception as e:
 #         result = '500'
 #     print(result)

12.socket编程

 #socket   osi 七层   tcp 三次握手
 #服务器端
 #socket.socket(AF_INET,SOCK_STREAM) 先创建sock实例
 #server.bind('0.0.0.0',8000)  监听Ip端口
 #server.listen(5)  可以多个并列
 #server.accept()  接收请求
 #conn(建立链接),client_addr(地址) = server.accept()
 #conn.send()  发送消息
 #conn.recv()  接收消息
 #server.close()
 #server.send()

 #客户端
 # socket.socket(AF_INET,SOCK_STREAM)
 # client.connect()
 # client.send()

12.socket编程  c s架构

client 端的代码量

 #!/usr/bin/env python
 #_*_coding:utf-8_*_

 # import socket
 # client = socket.socket()
 # client.connect(("localhost",9998))
 # while True:
 #     msg = input(">>:").strip()
 #     if len(msg) == 0: continue
 #     client.send(msg.encode("utf-8"))
 #     data = client.recv(1024)
 #     print("来自服务器:", data)
 # client.close()

 #基本结构
 # import socket
 # client = socket.socket()
 # client.connect(('localhost',8000))
 # client.send(b'hello')
 # date = client.recv(1024)
 # print(date)

 #
 # #循环收发
 # import socket
 # client = socket.socket()
 # client.connect(('localhost',8000))
 # while True:
 #     client.send(b'hello')
 #     date = client.recv(1024)
 #     print(date)

 #单循环客户发送信息
 # import socket
 # client = socket.socket()
 # client.connect(('localhost',8000))
 # while True:
 #     msg = input('>>>:').strip()
 #     if len(msg) == 0: continue
 #     client.send(msg.encode())
 #     date = client.recv(1024)
 #     print('laizisever',date)

 #排列链接
 # import socket
 # client = socket.socket()
 # client.connect(('localhost',8000))
 # while True:
 #     msg = input('>>>:').strip()
 #     if len(msg) == 0: continue
 #     client.send(msg.encode())
 #     date = client.recv(1024)
 #     print('laizisever',date)
 #

 #调用Linux系统命令实现ssh  top -bn 1
 # import socket
 # client = socket.socket()
 # client.connect(('10.10.10.140',8002))
 # while True:
 #     msg = input('>>>:').strip()
 #     if len(msg) == 0: continue
 #     print('to server', msg)
 #     client.send(msg.encode())
 #     date = client.recv(1024)
 #     print(date.decode())

 #调用Linux系统命令实现ssh  top -bn 1   将接收大文件数据
 import socket
 client = socket.socket()
 client.connect(('10.10.10.140',8002))
 while True:
     msg = input('>>>:').strip()
     if len(msg) == 0: continue
     print('to server', msg)
     client.send(msg.encode())
     date = client.recv(1024)
     print("res:",date.decode())
     total_size = int(date.decode())
     recevied_size = 0
     res = b''
     while recevied_size < total_size:
         d = client.recv(1024)
         res += d

         recevied_size += len(d)
     print("rece done----")
     print(res.decode())

server 端的代码量

 #!/usr/bin/env python
 #_*_coding:utf-8_*_

 # import socket
 # server = socket.socket() #获得socket实例
 #
 # server.bind(("localhost",9998)) #绑定ip port
 # server.listen()  #开始监听
 # print("等待客户端的连接...")
 # conn,addr = server.accept() #接受并建立与客户端的连接,程序在此处开始阻塞,只到有客户端连接进来...
 # print("新连接:",addr )
 # while True:
 #     data = conn.recv(1024)
 #     print("收到消息:",data)
 #     conn.send(b"server")
 # server.close()

 #基本结构
 # import socket
 # server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 # server.bind(('0.0.0.0',8000))
 # server.listen(5)
 # # print("hahahahaha")
 # conn,client_addr = server.accept()
 # print(conn,client_addr)
 # date = conn.recv(1024)
 # conn.send(b'woshisever')
 # print(date)

 # #循环收发
 # import socket
 # server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 # server.bind(('0.0.0.0',8000))
 # server.listen(5)
 # conn,client_addr = server.accept()
 #
 # while True:
 #     date = conn.recv(1024)
 #     print('shoudao client',date)
 #     conn.send(b'woshisever')

 #单循环收发客户端信息
 # import socket
 # server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 # server.bind(('0.0.0.0',8000))
 # server.listen(5)
 # conn,client_addr = server.accept()
 #
 # while True:
 #     date = conn.recv(1024)
 #     print('shoudao client',date)
 #     conn.send(b'woshisever')

 #排列链接,当一个断块,另一个可以链接
 # import socket
 # server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 # server.bind(('0.0.0.0',8000))
 # server.listen(5)
 #
 # while True:
 #     conn,client_addr = server.accept()
 #
 #     while True:
 #         try:
 #             date = conn.recv(1024)
 #             print('shoudao client',date)
 #             conn.send(b'woshisever')
 #         except ConnectionResetError as e:
 #             print(e)
 #             break

 #调用Linux系统命令实现ssh
 # import socket
 # import subprocess
 # server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 # server.bind(("0.0.0.0",8002))
 # server.listen(5)
 # print("--------listen-----------")
 #
 # while True:
 #     conn,client_addr = server.accept()
 #     while True:
 #         date = conn.recv(1024)
 #         print("recv from cli:",date)
 #         res = subprocess.Popen(date,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
 #         conn.send(res.stdout.read())

 #调用Linux系统命令实现ssh  实现大数据返回消息
 # import socket
 # import subprocess
 # server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 # server.bind(("0.0.0.0",8002))
 # server.listen(5)
 # print("--------listen-----------")
 #
 # while True:
 #     conn,client_addr = server.accept()
 #     while True:
 #         date = conn.recv(1024)
 #         print("recv from cli:",date)
 #         res_obj = subprocess.Popen(date,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
 #         res = res_obj.stdout.read()
 #         conn.send(str(len(res)).encode())
 #         conn.send(res)

python学习道路(day8note)(抽象类,类的方法,异常处理,socket编程)的更多相关文章

  1. python学习日记(基础数据类型及其方法01)

    数字 int 主要是用于计算的,常用的方法有一种 #既十进制数值用二进制表示时,最少使用的位数i = 3#3的ASCII为:0000 0011,即两位 s = i.bit_length() print ...

  2. Python学习系列(九)&lpar;IO与异常处理)

    Python学习系列(九)(IO与异常处理) Python学习系列(八)( 面向对象基础) 一,存储器 1,Python提供一个标准的模块,称为pickle,使用它既可以在一个文件中存储任何Pytho ...

  3. python学习道路&lpar;day7note&rpar;&lpar;subprocess模块,面向对象&rpar;

    1.subprocess模块   因为方法较多我就写在code里面了,后面有注释 #!/usr/bin/env python #_*_coding:utf-8_*_ #linux 上调用python脚 ...

  4. Python学习笔记总结&lpar;三&rpar;类

    一.类简单介绍 1.介绍 类是Python面向对象程序设计(OOP)的主要工具,类建立使用class语句,通过class定义的对象. 类和模块的差异,类是语句,模块是文件. 类和实例 实例:代表程序领 ...

  5. Python学习总结19:类(一)

    在Python中,可以通过class关键字定义自己的类,通过类私有方法“__init__”进行初始化.可以通过自定义的类对象类创建实例对象. class Student(object): count ...

  6. python学习小结4:类

    虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程. 类和对象是面向对象编程的两个主要方面.类:创建一个新类型,而对象是这个类的实例,类使用class关键字创建.类的域和方法被列在一个 ...

  7. python学习笔记&lpar;六&rpar;、类

    Python与java.c++等都被视为一种面向对象的语言.通过创建自定义类,用于处理各种业务逻辑.面向对象有封装.继承.多态三个特征,这也是面子对象语言的通用特征. 1 封装 封装,是值向外部隐藏内 ...

  8. 调用其他python脚本文件里面的类和方法

    问题描述: 自己编写了若干个Python脚本. 在testC.py里面需要调用testA.py和testB.py里面的若干类和方法.要怎么办? 需要都打包.安装,再去调用吗? 其实不必那么麻烦. 这里 ...

  9. day07 类的进阶,socket编程初识

    类的静态方法: 正常: 添加静态方法: 就会变成一个函数,不会自动传self 参数,不会调用类的变量和实例的变量  不在需要self 名义上归类管,但是它就是一个单独的函数,不在需要传入self,想怎 ...

随机推荐

  1. cocos2d-x 利用CCLabelTTF制作文字描边与阴影效果的实现方法

    // // myttf.h// // Created by 王天宇 on 14-6-12. // // #ifndef ____SLG__myttf__ #define ____SLG__myttf_ ...

  2. java&lowbar;类泛型承继方法

    package ming; class Apple3<T>{ private T info; public Apple3(){} public Apple3(T info){ this.i ...

  3. HDOJ 2114 Calculate S&lpar;n&rpar;(找周期)

    Problem Description Calculate S(n). S(n)=1^3+2^3 +3^3 +--+n^3 . Input Each line will contain one int ...

  4. javascritp第十课&colon;面向对象

    js中的函数就是对象,对象就是函数,当js中需要使用面向对象,使用js闭包模拟面向对象,当函数作为对象使用时,每个单词首字母都大写 var obj=new object();  //js中默认就是ob ...

  5. automake&sol;autoconf的简单例子

    参考文章1:http://loftor.com/archives/automake.html 参考文章2:http://www.blogjava.net/huyi2006/articles/18790 ...

  6. 表达式求值(栈方法&sol;C&plus;&plus;语言描述)(二)

    上篇中完成了对表达式求值的整体过程,接下来看看如何处理不同类型的token. 对运算数的处理比较简单,它直接调用函数strtod(),将字符串中的运算数转换为浮点类型并将它压入运算数栈中: void ...

  7. 一文搞定MySQL的事务和隔离级别

    一.事务简介 事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成. 一个数据库事务通常包含了一个序列的对数据库的读/写操作.它的存在包含有以下两个目的: 为数据库操作序列提供 ...

  8. Java知识回顾 (4)Java包装类

    一. Java Number 一般地,当需要使用数字的时候,我们通常使用内置数据类型,如:byte.int.long.double 等. 然而,在实际开发过程中,我们经常会遇到需要使用对象,而不是内置 ...

  9. C&num; 测试代码段性能耗时

     一:              DateTime BeginTime = System.DateTime.Now;            //代码            DateTime EndTi ...

  10. linux系统启动顺序及init模式

    磁盘的第一个扇区(512bytes)主要记录了两个重要信息: 主引导分区MBR:master boot record,安装引导加载程序的地方,446bytes 分区表:partition table: ...