十九、面向对象补充与异常处理

一、继承
  • 继承存在的意义: 将公共的方法提取到父类中, 有利于代码的重用性

  • 继承的编写方式:

    # 继承
    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块中的代码。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值