约束和异常
一:约束:
  约束方法:(解释:就相当于在想项目中,先提前规划好框架和约定基本代码,像定义好调用的名字后,后面的名字只能用这个,用其他的
  名字就会抛出异常。错误)

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--面向对象--约束的更多相关文章

  1. python学习之路-8 面向对象之进阶

    上篇内容回顾和补充 面向对象三大特性 封装 继承 多态 在python中没有多态的概念 变量的类型允许为多种数据类型称之为多态 # c#/java中的多态 # 伪代码 def func(int arg ...

  2. Python学习之路10☞面向对象进阶

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(objec ...

  3. Python学习之路9☞面向对象的程序设计

    一 面向对象的程序设计的由来 见概述:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二 什么是面向对象的程序设计及为什么要有它 面向过 ...

  4. Python学习之路——类-面向对象编程

    类 面向对象编程 通过类获取一个对象的过程 - 实例化 类名()会自动调用类中的__init__方法 类和对象之间的关系? 类 是一个大范围 是一个模子 它约束了事务有哪些属性 但是不能约束具体的值 ...

  5. python学习之路------你想要的都在这里了

    python学习之路------你想要的都在这里了 (根据自己的学习进度后期不断更新哟!!!) 一.python基础 1.python基础--python基本知识.七大数据类型等 2.python基础 ...

  6. python学习之路-day2-pyth基础2

    一.        模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,第三方库存放位置:site-packages sys模块简介 导入模块 import sys 3 sys模 ...

  7. Python学习之路-Day2-Python基础3

    Python学习之路第三天 学习内容: 1.文件操作 2.字符转编码操作 3.函数介绍 4.递归 5.函数式编程 1.文件操作 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个 ...

  8. Python学习之路-Day2-Python基础2

    Python学习之路第二天 学习内容: 1.模块初识 2.pyc是什么 3.python数据类型 4.数据运算 5.bytes/str之别 6.列表 7.元组 8.字典 9.字符串常用操作 1.模块初 ...

  9. Python学习之路-Day1-Python基础

    学习python的过程: 在茫茫的编程语言中我选择了python,因为感觉python很强大,能用到很多领域.我自己也学过一些编程语言,比如:C,java,php,html,css等.但是我感觉自己都 ...

  10. python学习之路网络编程篇(第四篇)

    python学习之路网络编程篇(第四篇) 内容待补充

随机推荐

  1. 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 ...

  2. iframe 模拟ajax文件上传and formdata ajax 文件上传

    对于文件上传 有好多种方式,一直想总结 文件上传的方法 今天就来写下 iframe  的文件上传的代码 本人语言表达能里有限,不多说了 直接上代码. 首先看 总体页面. 总共就三个文件. 实际上也就是 ...

  3. AntD02 Table组件的使用

    1 前提准备 1.1 创建一个angular项目 1.2 将 Ant Design 整合到 Angular 项目中 1.3 官方文档 点击前往 2 简单使用 <nz-table #rowSele ...

  4. 在Ubuntu上源码安装NodeJS

    Refer http://nqdeng.github.io/7-days-nodejs/#7.1 前提条件: 确保系统下g++版本(g++ -v)在4.6以上,python版本(python --ve ...

  5. c语言交换两个变量的值

    有两个变量a 和b,想要交换它们的值 int a,b; 能不能这样操作呢? b=a; a=b; 不能啊,这样操作的意思是把a的值放到b中,然后b中的值已经被覆盖掉了,已经不是b原来的那个值了,所以是没 ...

  6. Luogu 3665 [USACO17OPEN]Switch Grass 切换牧草

    BZOJ 4777 被权限了. 这道题的做法看上去不难,但是感觉自己yy不出来. 首先是两个结论: 1.答案一定是连接着两个异色点的一条边. 2.答案一定在最小生成树上. 感觉看到了之后都比较显然,自 ...

  7. IIS身份验证知识摘录

    IIS 身份验证 ASP.NET 身份验证分为两个步骤.首先,Internet 信息服务 (IIS) 对用户进行身份验证,并创建一个 Windows 令牌来表示该用户.IIS 通过查看 IIS 元数据 ...

  8. 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 出错原因: ...

  9. 实践作业3:接到任务及思考DAY1

    今天,老师又布置了新的学习任务,关于白盒测试.感觉黑盒测试,我们用的比较多,白盒测试就相对陌生了.上课的时候老师虽然也进行了一定的点拨,外加我们学习了SPOC视频,但是并没有看到什么具体的项目,所以实 ...

  10. TensorFlow中文手册

    注意:本文只为读书笔记. 第一章 起步 - 起步 - [介绍](SOURCE/get_started/introduction.md) - [下载及安装](SOURCE/get_started/os_ ...