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学习之路网络编程篇(第四篇) 内容待补充
随机推荐
- SQL SERVER 微软下载地址
https://www.microsoft.com/zh-cn/search/DownloadsDrillInResults.aspx?q=sql+server+2012&cateorder= ...
- 293. Flip Game只翻转一步的加减号翻转游戏
[抄题]: You are playing the following Flip Game with your friend: Given a string that contains only th ...
- 关于ptrdiff_t
整除.opencv中的内存一般是通过malloc分配,不能保证都是都能被16整除,此时需要截断,但是剩下的内存要如何维护? CV2.0的这样维护的:在 malloc 是多申请一个指针的空间,这个指针指 ...
- ROS indigo 删除和安装
删除比较容易: sudo apt-get remove ros-jade-desktop-full 但是如果怕删不干净可以采用: sudo apt-get remove ros-* ,但是不确定会 ...
- SpringMVC——文件的上传
一.加入依赖 commons-io-2.0.jar commons-fileupload-1.2.1.jar 二.接口MultipartResolver Spring MVC 为文件上传提供了直接的支 ...
- iPhone的home键进果汁了,按起来粘粘的感觉
解决办法是按住home键转动一下,再用棉签蘸点水或者酒精都行(注意:水不要太多,不能让水渗进去),用棉签按压home 键多转几圈就好了.
- c# .NET开发邮件发送功能的全面教程(含邮件组件源码)
http://www.cnblogs.com/heyuquan/p/net-batch-mail-send-async.html
- JAVA读取控制台的输入【转】
前面介绍了使用IO类实现文件读写的示例,其实在很多地方还需要使用到IO类,这里再以读取控制台输入为例子来介绍IO类的使用. 控制台(Console)指无图形界面的程序,运行时显示或输入数据的位置,前面 ...
- Django不能使用ip方式访问的解决办法
问题: 启动服务后,使用http://127.0.0.1:8000/showcase/或者http://localhost:8000/showcase/都能访问, 但是使用http://192.168 ...
- 图像读取Exif小知识,图像扶正,还原拍摄时的角度
在做人脸识别的时候发现很多手机拍摄的图像在C#读取之后方向出现了错误,Bitmap中的宽度和实际的windows的文件属性内的参数相反,引起一阵测试和思考,后来百度出来可以用Exif来解决 githu ...