python学习之路---day19--面向对象--约束
约束和异常
一:约束:
约束方法:(解释:就相当于在想项目中,先提前规划好框架和约定基本代码,像定义好调用的名字后,后面的名字只能用这个,用其他的
名字就会抛出异常。错误)
1:提取父类,然后再父类中定义好方法,在这个方法什么不用干,就抛出
一个异常,这样所有的子类必须重写这个方法,否则就会报错
2:使用原类来描述父类,在元类中给出一个抽象方法 这样子类就不得不给出抽象方法的具体、
方法的具体实现,可以起到约束的效果
001):从实例理解
第一种约束方法:
提取父类,然后在父类中定义好方法,在这个方法什么不用干,就抛出一个异常,
这样所有的子类必须重写这个方法,否则就会报错
基本思想:相当于就是 一个 基本的程序,分为多个模块,然后分配给不同的人去做,但是每个人的代码习惯和取名习惯不一样
,在后面的总的模块合在一起,需要调用相同的功能时,名字不一样,从而造成有的模块没有调用到而产生异常
01)实例01:
class Base: #这个是用来约束后面不同成员的函数,强制子类不能乱起函数名字,必须是用login ,不然会报错 def login(self):
raise NotImplementedError ("子类没有实现继承") class Normal(Base): #
def login(self):
print("游客") class Member(Base):
def login(self): 这里这里将login(self)登陆名字写成 denglu(self) 后面的程序是执行不了的
print("吧务的登陆")
class Admin(Base):
def login(self):
print("管理员") def login(obj):
print("准备")
obj.login()
print("主页进入 ") n=Normal() #实例化对象
m=Member()
a=Admin()
login(n) #调用功能。这里如果的有的登陆名字写成 denglu(n) 后面的程序是执行不了的
login(m)
login(a)
002):第二约束方法:
2:使用原类来描述父类,在元类中给出一个抽象方法 这样子类就不得不给出抽象方法的具体、
方法的具体实现,可以起到约束的效果
基本思想: 写出抽象类和抽象方法,来约束后面的子类
实例02:
from abc import ABCMeta ,abstractmethod class Base(metaclass=ABCMeta): #抽象类
#抽象类
@abstractmethod #
def login(self): #强制子类做xxx事
pass
def haha(self): #这个是抽象类里面的正常的方法,是可以有的,,怎么调用它呢????????
print("hahawowo o") class Normal(Base):
pass
def login(self): #重写了父类的抽象方法
print("普通账号的登陆")
n=Normal() 原因时Base是一个抽象类,含有抽象方法,不允许创建实例对象
b=Base() #报错:TypeError: Can't instantiate abstract class Base with abstract methods login
b.haha() #报错:TypeError: Can't instantiate abstract class Base with abstract methods login
一个类如果全部都是抽象方法,这个类可以被接口,用来约束子类和规范子类 from abc import ABCMeta,abstractmethod #写抽象类需要引入抽象模块
class Animal(metaclass=ABCMeta):
@abstractmethod
def chi(self): #抽象概念
pass
class Cat(Animal):
def chi(self): #子类对抽象的内容给出具体的实现,重写
print("猫用嘴吃")
c=Cat()
c.chi() a=Animal()
a.chi() #TypeError: Can't instantiate abstract class Animal with abstract methods chi
二:异常处理
001):异常:程序在运行时出现了错误
002):先认识异常:
def chu(a,b):
return a/b
ret=chu(3,0)
print(ret)
报错: ZeroDivisionError: division by zero
#我们知道除数是不能为0的, 解决异常:
try: .... except 运行xx代码,出现了错误就执行except 后面的代码
def chu(a,b):
return a/b
try:
ret=chu(3,0)
print(ret)
except Exception as e:
print("除数不能为0")
打印结果:除数不能为0 由python解释器来调用代码. 出现了错误. 系统会自动的产生一个叫异常的对象.
系统会尝试着把错误返回给调用方. 过程被称为:抛异常
我们通过try...except 可以吧系统产生的这个错误获取到. 过程叫捕获异常
异常处理实例:
import traceback
#计算a+b
def cul(a,b):
if (type(a) == int or type(a)==float) and (type(b)==int or type(b)==float):
return a+b
else:
# 在这里有两种方案. 1. 直接返回 , 2. 抛出异常
# # raise 抛出 Exception 错误和异常,所有错误的根
raise Exception("要的是整型和float型 ")
#捕获异常:
try:
print(cul(1,"是的")) #我们给其错误的信息看看
except Exception as e:
#获取到错误信息,我们需要访问堆栈信息
print(traceback.format_exc()) #获取堆栈信息
print("出现了错误") 有些错误是python 内部没有给我们里出来的,我们就需要自定义异常,但是
自定义异常会出现问题就是 pyhton 不会给出具体的记录,所以自定义异常的
异常名字要符合规范,要慎用
自定义异常实例:
class GenderException(Exception): #自定义性别异常
pass
class Person:
def __init__(self,name,gender):
self.name=name
self.gender=gender def goto_nan_yushi(self):
if self.gender !="男":
raise GenderException("性别不对") #raise 这里就是给程序员看的,给其说明是哪里错误
else:
print("welcome") #处理捕获异常
try:
p1=Person("张三","男")
p1.goto_nan_yushi() p2=Person("李四","nv")
p2.goto_nan_yushi() except GenderException as e:
print("进错了") #这里错误是给客户看的 except Exception as e:
print("其他原因你不能进去") #这里错误是给客户看的
四:日志处理:
import logging
filename: ⽂件名
format: 数据的格式化输出. 最终在⽇志⽂件中的样⼦
时间-名称-级别-模块: 错误信息
datefmt: 时间的格式
level: 错误的级别权重, 当错误的级别权重⼤于等于leval的时候才会写⼊⽂件
logging.basicConfig(filename='x1.log',
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
level=30)
当前配置表示 0以上的分数会被写⼊⽂件
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0
logging.critical("我是critical") # 50分. 最贵的
logging.error("我是error") # 40分
logging.warning("我是warning")
logging.info("我是info")
logging.debug("我是debug")
logging.log(1, "我什么都不是") import traceback
try:
print(1/0)
except Exception:
logging.error(traceback.format_exc()) # 用法
print("出错了") import logging
# 创建⼀个操作⽇志的对象logger(依赖FileHandler)
# open()
file_handler = logging.FileHandler('zuo.log', 'a', encoding='utf-8')
file_handler.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s"))
logger1 = logging.Logger('qq', level=20)
logger1.addHandler(file_handler) # 把文件助手和日志对象绑定
logger1.error('我是A系统出错了') # 记录日志 # 再创建⼀个操作⽇志的对象logger(依赖FileHandler)
file_handler2 = logging.FileHandler('you.log', 'a', encoding='utf-8')
file_handler2.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s -%(levelname)s -%(module)s: %(message)s"))
logger2 = logging.Logger('B系统', level=20)
logger2.addHandler(file_handler2) import traceback
try:
print(1/0)
except Exception:
logger2.critical(traceback.format_exc())
print("出错了. 请联系管理员")
print("程序继续执行") from types import MethodType, FunctionType
class Foo:
@classmethod
def func1(self):
pass
@staticmethod
def func2(self):
pass
def func3(self):
pass def func4(self):
pass # obj = Foo()
# lst.append(obj.func4)
# for item in lst:
# print(isinstance(item, MethodType))
python学习之路---day19--面向对象--约束的更多相关文章
- python学习之路-8 面向对象之进阶
上篇内容回顾和补充 面向对象三大特性 封装 继承 多态 在python中没有多态的概念 变量的类型允许为多种数据类型称之为多态 # c#/java中的多态 # 伪代码 def func(int arg ...
- Python学习之路10☞面向对象进阶
一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(objec ...
- Python学习之路9☞面向对象的程序设计
一 面向对象的程序设计的由来 见概述:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二 什么是面向对象的程序设计及为什么要有它 面向过 ...
- Python学习之路——类-面向对象编程
类 面向对象编程 通过类获取一个对象的过程 - 实例化 类名()会自动调用类中的__init__方法 类和对象之间的关系? 类 是一个大范围 是一个模子 它约束了事务有哪些属性 但是不能约束具体的值 ...
- python学习之路------你想要的都在这里了
python学习之路------你想要的都在这里了 (根据自己的学习进度后期不断更新哟!!!) 一.python基础 1.python基础--python基本知识.七大数据类型等 2.python基础 ...
- python学习之路-day2-pyth基础2
一. 模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,第三方库存放位置:site-packages sys模块简介 导入模块 import sys 3 sys模 ...
- Python学习之路-Day2-Python基础3
Python学习之路第三天 学习内容: 1.文件操作 2.字符转编码操作 3.函数介绍 4.递归 5.函数式编程 1.文件操作 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个 ...
- Python学习之路-Day2-Python基础2
Python学习之路第二天 学习内容: 1.模块初识 2.pyc是什么 3.python数据类型 4.数据运算 5.bytes/str之别 6.列表 7.元组 8.字典 9.字符串常用操作 1.模块初 ...
- Python学习之路-Day1-Python基础
学习python的过程: 在茫茫的编程语言中我选择了python,因为感觉python很强大,能用到很多领域.我自己也学过一些编程语言,比如:C,java,php,html,css等.但是我感觉自己都 ...
- python学习之路网络编程篇(第四篇)
python学习之路网络编程篇(第四篇) 内容待补充
随机推荐
- 170318 11:44:26 [ERROR] Can't start server: can't create PID file: No space left on device
数据库挂了.打开远程,进了系统,service mysqld stop 失败.service mysqld start等了好大一会,提示Timeout error occurred trying to ...
- iframe 模拟ajax文件上传and formdata ajax 文件上传
对于文件上传 有好多种方式,一直想总结 文件上传的方法 今天就来写下 iframe 的文件上传的代码 本人语言表达能里有限,不多说了 直接上代码. 首先看 总体页面. 总共就三个文件. 实际上也就是 ...
- AntD02 Table组件的使用
1 前提准备 1.1 创建一个angular项目 1.2 将 Ant Design 整合到 Angular 项目中 1.3 官方文档 点击前往 2 简单使用 <nz-table #rowSele ...
- 在Ubuntu上源码安装NodeJS
Refer http://nqdeng.github.io/7-days-nodejs/#7.1 前提条件: 确保系统下g++版本(g++ -v)在4.6以上,python版本(python --ve ...
- c语言交换两个变量的值
有两个变量a 和b,想要交换它们的值 int a,b; 能不能这样操作呢? b=a; a=b; 不能啊,这样操作的意思是把a的值放到b中,然后b中的值已经被覆盖掉了,已经不是b原来的那个值了,所以是没 ...
- Luogu 3665 [USACO17OPEN]Switch Grass 切换牧草
BZOJ 4777 被权限了. 这道题的做法看上去不难,但是感觉自己yy不出来. 首先是两个结论: 1.答案一定是连接着两个异色点的一条边. 2.答案一定在最小生成树上. 感觉看到了之后都比较显然,自 ...
- IIS身份验证知识摘录
IIS 身份验证 ASP.NET 身份验证分为两个步骤.首先,Internet 信息服务 (IIS) 对用户进行身份验证,并创建一个 Windows 令牌来表示该用户.IIS 通过查看 IIS 元数据 ...
- Cannot resolve the collation conflict between "Chinese_PRC_CI_AS" and "SQL_L及由于排序规则不同导致查询结果为空的问题
报错:Cannot resolve the collation conflict between "Chinese_PRC_CI_AS" and "SQL_L 出错原因: ...
- 实践作业3:接到任务及思考DAY1
今天,老师又布置了新的学习任务,关于白盒测试.感觉黑盒测试,我们用的比较多,白盒测试就相对陌生了.上课的时候老师虽然也进行了一定的点拨,外加我们学习了SPOC视频,但是并没有看到什么具体的项目,所以实 ...
- TensorFlow中文手册
注意:本文只为读书笔记. 第一章 起步 - 起步 - [介绍](SOURCE/get_started/introduction.md) - [下载及安装](SOURCE/get_started/os_ ...