手把手教你从零开始学python 第八章--面向对象3

本文介绍了Python编程中的多态概念,通过实例展示了如何利用继承和重写方法实现多态。同时,讲解了异常处理,包括try-except语句和自定义异常。此外,还提到了finally关键字的使用,with语句的上下文管理,以及如何创建自定义异常。最后,探讨了装饰器的高级用法和可迭代对象与迭代器的区别和应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从零开始学python持续更新中 🚤🚤🚤

写作辛苦点点关注🆗

📝个人主页→数据挖掘博主ZTLJQ的主页

☄️python系列专栏 - 从零开始学python


文章目录

目录

从零开始学python持续更新中 🚤🚤🚤

☄️一、多态的使用

☄️二、异常处理

☄️三、finally关键字的使用

☄️四、with关键字的使用

☄️五、自定义异常

☄️六、高级装饰器

☄️七、可迭代对象和迭代器


☄️一、多态的使用

多态是基于继承,通过子类重写父类的方法
达到不同的子类对象调用相同的父类方法,得到不同的结果提高代码的灵活度

👇🏾👇🏾👇🏾 

这个是不使用多态的情况

class PoliceDog(object):
    def attack_enemy(self):
        print('狗正在攻击坏人')

class BlindDog(object):
    def lead_road(self):
        print('导盲犬正在指路')

class DrugDog(object):
    def search_drug(self):
        print('缉毒犬正在搜毒')

class Person(object):
    def __init__(self,name):
        self.name = name

    def work_with_pd(self):
        print(self.name + '正在工作')
        self.dog.attack_enemy()

    def work_with_bd(self):
        print(self.name + '正在工作')
        self.dog.lead_road()

    def work_with_dd(self):
        print(self.name + '正在工作')
        self.dog.search_drug()

p = Person('警官')

pd = PoliceDog()
p.dog = pd
p.work_with_pd()

bd = BlindDog()
p.dog = bd
p.work_with_bd()

dd = DrugDog()
p.dog = dd
p.work_with_dd()

👇🏾👇🏾👇🏾

这个是使用多态的情况

使用多态的情况
通过子类继承父类 使用同一个work方法
然后用重写的方法 使用多态

class Dog(object):
    def work(self):
        print('狗正在工作')

class PoliceDog(Dog):
    def work(self):
        print('狗正在攻击坏人')

class BlindDog(Dog):
    def work(self):
        print('导盲犬正在指路')

class DrugDog(Dog):
    def work(self):
        print('缉毒犬正在搜毒')


class Person(object):
    def __init__(self,name):
        self.name = name
        self.dog = None

    def work_with_dog(self):
        if self.dog is not None and isinstance(self.dog,Dog):
        # 这个就是判断 这个狗不为空且这个dog是Dog类的实例对象才可以调
            self.dog.work()


p = Person('警官')

pd = PoliceDog()
p.dog = pd
p.work_with_dog()

bd = BlindDog()
p.dog = bd
p.work_with_dog()

dd = DrugDog()
p.dog = dd
p.work_with_dog()

☄️二、异常处理

在程序运行过程中,由于编码不规范等造成程序无法正常执行
此时程序就会报错

除法  除以0是肯定会报错的 但是一般程序报错以后程序就直接报错 

这样如果出错了就会返回 输出:程序出错

def chu(a,b):
    return a/b

try:
    x = chu(1,0)
except Exception as e:
    print('程序出错')
else:
    print('计算结果是',x)

上面这个 as e 就是给异常取了名字

异常处理的使用场景

age=input('请输入您的年龄:')
#input接收到的用户翰入是一个字符串

try:
    age = float(age)
except ValueError as e:
    print('输入的不是数字')
else:
    if age > 18:
        print('欢迎来到我的网站')

☄️三、finally关键字的使用

finally其实可以理解为 最终都会被执行的代码

一般情况下 一个函数最多只会执行一个return语句

特殊情况下(finally语句)下,一个函数可能会执行多个return

def test(a,b):
    x = a // b
    y = a % b


def demo(a,b):
    try:
        x = a/b
    except ZeroDivisionError:
        return '除数不能为0'
    else:
        return x
    finally:
        return 'good'  # 如果函数里面有finally,finally里的返回值会覆盖之前的返回值

print(demo(1,0))

☄️四、with关键字的使用

with我们称之为上下文管理器,很多需要手动关闭的链接都可以使用with关键字 自动关闭连接
with关键字后面对象,需要实现__enter__和__exit__魔法方法

运行下面代码需要自行创建文件

try:
    file = open('test.txt','r')
except FileNotFoundError:
    print('文件不存在')
else:
    try:
        file.read()
    finally:
        file.close()


# with关键字会帮助我们关闭文件
try:
    with open('test.txt','r') as file:
        file.read() # 不需要手动关闭文件
except FileNotFoundError:
    print('文件未找到')

👇🏿👇🏿👇🏿

with 语句后面的结果对象,需要重写__enter__和__exit__方法
当进入到with代码块时,会自动调用__enter__方法里的代码
当with代码块执行完成以后,会自动调用__exit__方法

☄️五、自定义异常

系统内置的异常:

ZeroDivisionError : 除以0的异常 1/0
FileNotFoundError : 文件不存在异常
FileExistsError : 多次创建同名的文件夹 文件重复报错
ValueError : 数据值不对 转换不了值 比如 int('a')
KeyError : 就是字典里面 键值不存在 或者输入错误
SyntaxError : 报语法错误 比如 用了中文的括号或者逗号啥的
IndexError : 脚标的错误,就是列表只有2个然后写 list1[5]

👇🏿👇🏿👇🏿


# 自定义异常

class LengthError(Exception):
    def __init__(self,x,y):
        self.x = x
        self.y = y

    def __str__(self):
        return '长度必须要在{}至{}之间'.format(self.x,self.y)

password = input('请输入你的密码:')
m = 6
n = 12
if m <= len(password) <= n:
    print('密码正确')
else:
    # raise 就是抛出一个异常 抛出的这个异常是我们自己定义的异常
    raise LengthError(m,n)

print('密码已保存至数据库')

☄️六、高级装饰器

def can_play(clock):
    print('最外层函数被调用了:clock={}'.format(clock))
    def handle(fn):
        def inner(name,game):
            if clock < 21:
                fn(name,game)
            else:
                print('clock大于21')
        return inner # 这个返回值 inner 是handle函数的返回值
    return handle # 这个返回值 是can_play函数的返回值




@can_play(20)
def play_game(name,game):
    print(name+'正在玩'+game)


# 这个play_game 是调用 inner
play_game('张三','LOL')

☄️七、可迭代对象和迭代器

有很多可迭代对象

以下都是可迭代对象
👇🏿👇🏿👇🏿
"""

list
tuple
dict
set
str
range
filter
map

"""
# for  in  可迭代对象

from collections.abc import Iterable

# class foo(object):
#     def __next__(self):
#         return 1
#
#
# class demo(object):
#     def __init__(self,x):
#         self.x = x
#
#     def __iter__(self): # 只要重写了 __iter__方法就是一个可迭代对象
#         return foo()
#
# d = demo(100)
# # 这原本是False 重写__iter__之后就 变成False
# print(isinstance(d,Iterable)) # 判断是不是可迭代对象
#
# # for in 循环的本质就是调用对像的__iter__方法,获取到这个方法的返回值
# # 这个返回值是一个对象,然后再调用这个对象的__next__方法
# for i in d:
#     print(i)



class demo(object):
    def __init__(self,x):
        self.x = x
        self.count = 0

    def __iter__(self): # 只要重写了 __iter__方法就是一个可迭代对象
        return self

    def __next__(self):
        # 每一次 for in 都会调用一次 __next__方法 获取返回值
        self.count += 1
        if self.count <= self.x:
            return 'Hello'
        else:
            raise StopIteration # 这个是让迭代器停止用的

d = demo(10)

for i in d:
    print(i)

🔎🔎🔎我真诚的希望您喜欢从零开始学python系列文章!!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZTLJQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值