一、继承
-
继承存在的意义: 将公共的方法提取到父类中, 有利于代码的重用性
-
继承的编写方式:
# 继承 class Base: pass class Foo(Base): pass
# 多继承 class Base: pass class Foo: pass class Bar(Base, Foo): pass
-
调用类中的成员时,遵循
- 有限在自己所在类中找, 没有的话则去负责中招
- 如果类存在多继承, 则优先找左边在找右边
mro : 如果类中存在继承关系, 通过mro()获取当前的继承关系
class C:
pass
class B:
pass
class A(C, B):
pass
print(A.mro())
print(A.__mro__)
# 输出结果
# [<class '__main__.A'>, <class '__main__.C'>, <class '__main__.B'>, <class 'object'>]
# (<class '__main__.A'>, <class '__main__.C'>, <class '__main__.B'>, <class 'object'>)
简写为:A -> B -> D -> G -> H -> K -> C -> E -> F -> M -> N -> P -> object
继承补充: 从左到右,深度优先,大小钻石,留住顶端,基于这句话可以更快的找到继承关系。
二、内置函数
-
callble: 是否可在后面加括号执行
-
函数
def func(): pass print(callable(func)) # True
-
类
class Foo: pass print(callable(Foo)) # True
-
类中具有
__call__
方法class Foo: def __call__(self, *args, **kwargs) pass obj = Foo() print(callable(obj)) # True
-
-
super
class Top: def message(self, num): print('Top.message', num) class Base(Top): pass class Foo(Base): def message(self, num): print('Foo.message', num) super().message(num + 100) obj = Foo() obj.message(1) # Foo.message 1 # Top.message 101
示例2: 注意
class Base: def message(self, num): print('Base.message', num) super().message(1000) class Bar: def message(self, num): print('Bar.message', num) class Foo(Base, Bar): pass obj = Foo() obj.message(1) # Base.message 1 # Bar.message 1000
-
isinstance: 判断对象是否是某个类或者其子类的实例
class Top: pass class Base(Top): pass class Foo(Base): pass v1 = Foo() print(isinstance(v1, Foo)) # True print(isinstance(v1, Base)) # True print(isinstance(v1, Top)) # True
-
issubclass: 判断是否是某个类的子孙类
class Top(object): pass class Base(Top): pass class Foo(Base): pass print(issubclass(Foo, Base)) # True print(issubclass(Foo, Top)) # True
三、异常处理
3.1 基本异常处理
在程序开发中,如果遇到一些不可预知的错误时, 可以选择用异常处理
# 语法
try:
res = requests.get(url=url)
except Exception as e:
代码块,上述代码异常执行
print('结束')
示例:
import requests
while True:
url = inpurt('请输入需要下载的网址')
try:
res = requests.get(url=url)
except Exception as e:
print('请求失败, 原因:{}'.format(str(e)))
continue
with open('conten.txt')
-
后续场景引用场景:
-
调用微信的API实现微信的额推送
-
支付宝支付
-
数据库、redis连接操作等
-
3.2异常细分
Exception: 是只是场景的异常, 如果我们想要获取详细的异常信息, 需要对异常进行一份, 这样才能获取详细的异常信息
import requests
from requests import exceptions
`
while True:
url = input("请输入要下载网页地址:")
try:
res = requests.get(url=url)
print(res)
except exceptions.MissingSchema as e:
print("URL架构不存在")
except exceptions.InvalidSchema as e:
print("URL架构错误")
except exceptions.InvalidURL as e:
print("URL地址格式错误")
except exceptions.ConnectionError as e:
print("网络连接错误")
except Exception as e:
print("代码出现错误", e)
# 提示:如果想要写的简单一点,其实只写一个Exception捕获错误就可以了。
-
场景异常
""" AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问n x[5] KeyError 试图访问字典里不存在的键 inf['xx'] KeyboardInterrupt Ctrl+C被按下 NameError 使用一个还未被赋予对象的变量 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了) TypeError 传入对象类型与要求的不符合 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 导致你以为正在访问它 ValueError 传入一个调用者不期望的值,即使值的类型是正确的 """
-
更多异常: https://www.runoob.com/python/python-exceptions.html
3.2 自定义异常&抛出异常
在开发过程中也可以自定义异常
class MyException(Exception):
pass
try:
pass
except MyException as e:
print("MyException异常被触发了", e)
except Exception as e:
print("Exception", e)
对于我们自定义的异常,如果想要触发,则需要使用:raise MyException()
类实现。
class MyException(Exception):
pass
try:
# 。。。
raise MyException()
# 。。。
except MyException as e:
print("MyException异常被触发了", e)
except Exception as e:
print("Exception", e)
class MyException(Exception):
def __init__(self, msg, *args, **kwargs):
super().__init__(*args, **kwargs)
self.msg = msg
try:
raise MyException("xxx失败了")
except MyException as e:
print("MyException异常被触发了", e.msg)
except Exception as e:
print("Exception", e)
class MyException(Exception):
title = "请求错误"
try:
raise MyException()
except MyException as e:
print("MyException异常被触发了", e.title)
except Exception as e:
print("Exception", e)
案例一:你我合作协同开发,你调用我写的方法。
-
我定义了一个函数
class EmailValidError(Exception): title = "邮箱格式错误" class ContentRequiredError(Exception): title = "文本不能为空错误" def send_email(email,content): if not re.match("\w+@live.com",email): raise EmailValidError() if len(content) == 0 : raise ContentRequiredError() # 发送邮件代码... # ...
-
你调用我写的函数
def execute(): # 其他代码 # ... try: send_email(...) except EmailValidError as e: pass except ContentRequiredError as e: pass except Exception as e: print("发送失败") execute() # 提示:如果想要写的简单一点,其实只写一个Exception捕获错误就可以了。
案例二:在框架内部已经定义好,遇到什么样的错误都会触发不同的异常。
import requests
from requests import exceptions
while True:
url = input("请输入要下载网页地址:")
try:
res = requests.get(url=url)
print(res)
except exceptions.MissingSchema as e:
print("URL架构不存在")
except exceptions.InvalidSchema as e:
print("URL架构错误")
except exceptions.InvalidURL as e:
print("URL地址格式错误")
except exceptions.ConnectionError as e:
print("网络连接错误")
except Exception as e:
print("代码出现错误", e)
# 提示:如果想要写的简单一点,其实只写一个Exception捕获错误就可以了。
3.3 特殊的finally
3.4 特殊的finally
try:
# 逻辑代码
except Exception as e:
# try中的代码如果有异常,则此代码块中的代码会执行。
finally:
# try中的代码无论是否报错,finally中的代码都会执行,一般用于释放资源。
print("end")
当在函数或方法中定义异常处理的代码时,要特别注意finally和return。
def func():
try:
return 123
except Exception as e:
pass
finally:
print(666)
func()
在try或except中即使定义了return,也会执行最后的finally块中的代码。