从零开始学python持续更新中 🚤🚤🚤
写作辛苦点点关注🆗
📝个人主页→数据挖掘博主ZTLJQ的主页
☄️python系列专栏 - 从零开始学python
文章目录
目录
☄️一、多态的使用
多态是基于继承,通过子类重写父类的方法
达到不同的子类对象调用相同的父类方法,得到不同的结果提高代码的灵活度
👇🏾👇🏾👇🏾
这个是不使用多态的情况
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系列文章!!!!