python学习道路(day8note)(抽象类,类的方法,异常处理,socket编程)
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编程)的更多相关文章
- python学习日记(基础数据类型及其方法01)
数字 int 主要是用于计算的,常用的方法有一种 #既十进制数值用二进制表示时,最少使用的位数i = 3#3的ASCII为:0000 0011,即两位 s = i.bit_length() print ...
- Python学习系列(九)(IO与异常处理)
Python学习系列(九)(IO与异常处理) Python学习系列(八)( 面向对象基础) 一,存储器 1,Python提供一个标准的模块,称为pickle,使用它既可以在一个文件中存储任何Pytho ...
- python学习道路(day7note)(subprocess模块,面向对象)
1.subprocess模块 因为方法较多我就写在code里面了,后面有注释 #!/usr/bin/env python #_*_coding:utf-8_*_ #linux 上调用python脚 ...
- Python学习笔记总结(三)类
一.类简单介绍 1.介绍 类是Python面向对象程序设计(OOP)的主要工具,类建立使用class语句,通过class定义的对象. 类和模块的差异,类是语句,模块是文件. 类和实例 实例:代表程序领 ...
- Python学习总结19:类(一)
在Python中,可以通过class关键字定义自己的类,通过类私有方法“__init__”进行初始化.可以通过自定义的类对象类创建实例对象. class Student(object): count ...
- python学习小结4:类
虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程. 类和对象是面向对象编程的两个主要方面.类:创建一个新类型,而对象是这个类的实例,类使用class关键字创建.类的域和方法被列在一个 ...
- python学习笔记(六)、类
Python与java.c++等都被视为一种面向对象的语言.通过创建自定义类,用于处理各种业务逻辑.面向对象有封装.继承.多态三个特征,这也是面子对象语言的通用特征. 1 封装 封装,是值向外部隐藏内 ...
- 调用其他python脚本文件里面的类和方法
问题描述: 自己编写了若干个Python脚本. 在testC.py里面需要调用testA.py和testB.py里面的若干类和方法.要怎么办? 需要都打包.安装,再去调用吗? 其实不必那么麻烦. 这里 ...
- day07 类的进阶,socket编程初识
类的静态方法: 正常: 添加静态方法: 就会变成一个函数,不会自动传self 参数,不会调用类的变量和实例的变量 不在需要self 名义上归类管,但是它就是一个单独的函数,不在需要传入self,想怎 ...
随机推荐
- Ubuntu 登录锐捷 网卡被禁用 网口灯不亮解决
cd rjsupplicantchmod +x rjsupplicant.sh sudo ./rjsupplicant.sh -u username-p password -d 1 sudo serv ...
- oracle插入数据时解决和旧数据id的冲突
我们在使用oracle创建一个主键的时候需要让他自增, 但是他跟mysql不同,需要创建序列,具体看下面: 可以删除之前创建的sequence,我们在重新创建一个: DROP SEQUENCE SJG ...
- python之路九
paramiko paramiko模块是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接 ssh执行命令: import paramikossh = pa ...
- PHPStorm XDebug的安装
环境: 我的系统: 4.4.0-43-generic #63-Ubuntu SMP Wed Oct 12 13:48:03 UTC 2016 x86_64 x86_64 x86_64 GNU/Linu ...
- 【ASP.NET】利用Nuget打包package——GUI方式
GUI方式 通过GUI的方式,可以下载如下的软件 NuGetPackageExplorer 打包dll 1.打开软件,在Package Content处点击右键 ,选择Add Lib 2.在lib ...
- java基本算法之快速排序
快速排序:是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确 ...
- 在yii框架中如何连接数据库mongodb
在文件夹common/config/main_local.php中加入如下代码: <?php return [ 'components' => [ 'mongodb' => [ 'c ...
- 各大就业网站对web前端的就业要求
今日与女神有约,在[web前端学习部落22群]有直播公开课,喜欢的朋友赶紧加入吧!随着高等教育的普及,高校毕业生的人数每年都以极快的速度增长,数据显示,2016年,高校毕业生多达765万人,比2015 ...
- AngularJS 表单
AngularJS 表单是输入控件的集合. HTML控件 以下 HTML input 元素被称为 HTML 控件: input 元素 select 元素 button 元素 textarea 元素 H ...
- JSON.stringify() / JSON.parse()
JSON.stringify() 这个方法可以把javascript对象转换成json字符串. JSON.parse() 这个方法可以把 json 字符串转换成 javascript对象. [下面来看 ...