# 面向对象三大特性: 封装, 继承, 多态
# 继承: 类与类之间产生的关系
# 子类 自动拥有(继承) 父类 的所有 方法 和 属性 (非私有)
好处
- 子类 继承自 父类,可以直接 享受 父类中已经封装好的方法,不需要再次开发
- 子类 中应该根据 职责,封装 子类特有的 属性和方法
- 当 父类 的方法实现不能满足子类需求时,可以对方法进行 重写(override)
举个栗子
不使用继承编写圆类和矩形类的计算
class Circle():
def __init__(self, r, color):
self.r = r
self.color = color
def area(self):
return 3.14*self.r*self.r
def show_color(self):
print(f"color = {self.color}")
class Rectangle():
def __init__(self, h, w, color):
self.h = h
self.w = w
self.color = color
def area(self):
return self.h*self.w
def show_color(self):
print(f"color = {self.color}")
c1 = Circle(10, "red")
print(c1.area())
c1.show_color()
rect1 = Rectangle(3, 4, "black")
print(rect1.area())
rect1.show_color()
使用继承
class 子类(父类):
pass
使用继承
# 父类
class Shape(object):
def __init__(self, color):
self.color = color
def area(self):
return None
def show_color(self):
print(f"color = {self.color}")
class Circle(Shape):
def __init__(self, r, color):
# 对父类属性进行初始化
super().__init__(color)
self.r = r
def area(self):
return 3.14*self.r*self.r
class Rectangle(Shape):
def __init__(self, h, w, color):
super().__init__(color)
self.h = h
self.w = w
def area(self):
return self.h*self.w
c1 = Circle(10, "red")
print(c1.area())
c1.show_color()
rect1 = Rectangle(3, 4, "black")
print(rect1.area())
rect1.show_color()
鲁班打大龙
from random import randint
class Hero:
def __init__(self, name, blood, strength):
self.name = name
self.blood = blood
self.strength = strength
def calc_health(self):
return self.blood
def take_damage(self, monster):
dmage = randint(monster.strength - 5, monster.strength + 5)
self.blood -= dmage
print(f"{self.name}你被{monster.name}攻击,受到了{str(dmage)}点伤害!还剩{str(self.blood)}滴血")
if self.calc_health() <= 0:
print(f"{self.name}你被杀死了!胜败乃兵家常事 请重新来过。")
return True
else:
return False
class Monster:
def __init__(self, name, blood, strength):
self.name = name
self.blood = blood
self.strength = strength
def calc_health(self):
return self.blood
def take_damage(self, hero):
dmage = randint(hero.strength - 5, hero.strength + 5)
self.blood -= dmage
print(f"{self.name}你被{hero.name}攻击,受到了{str(dmage)}点伤害!还剩{str(self.blood)}滴血")
if self.calc_health() <= 0:
print(f"{self.name}你被杀死了!胜败乃兵家常事 请重新来过。")
return True
else:
return False
hero1 = Hero("小鲁班", 200, 50)
monster1 = Monster("大龙", 1000, 10)
while True:
is_moster_died = monster1.take_damage(hero1)
if is_moster_died:
break
is_hero_died = hero1.take_damage(monster1)
if is_hero_died:
break
继承版本
from random import randint
class Sprite(object):
def __init__(self, blood, strength):
self.blood = blood
self.strength = strength
def calc_health(self):
return self.blood
def take_damage(self, sprite):
dmage = randint(sprite.strength - 5, sprite.strength + 5)
self.blood -= dmage
print(f"{self.name}你被{sprite.name}攻击,受到了{str(dmage)}点伤害!还剩{str(self.blood)}滴血")
if self.calc_health() <= 0:
print(f"{sprite.name}你被杀死了!胜败乃兵家常事 请重新来过。")
return True
else:
return False
class Hero(Sprite):
def __init__(self, name, blood, strength):
super().__init__(blood, strength)
self.name = name
class Monster(Sprite):
def __init__(self, name, blood, strength):
super().__init__(blood, strength)
self.name = name
hero1 = Hero("小鲁班", 200, 50)
monster1 = Monster("大龙", 1000, 10)
while True:
is_moster_died = monster1.take_damage(hero1)
if is_moster_died:
break
is_hero_died = hero1.take_damage(monster1)
if is_hero_died:
break
python异常处理
程序在运行时,如果 Python 解释器 遇到 到一个错误,会停止程序的执行,并且提示一些错误信息,这就是 异常
程序停止执行并且提示错误信息 这个动作,我们通常称之为:抛出(raise)异常
捕获异常
在程序开发中,如果 对某些代码的执行不能确定是否正确,可以增加 try(尝试) 来 捕获异常
捕获异常最简单的语法格式:
try:
尝试执行的代码
except:
出现错误的处理
- try 尝试,下方编写要尝试代码,不确定是否能够正常执行的代码
- except 如果不是,下方编写尝试失败的代码
age = input("请输入您的年龄")
try:
age = int(age)
except:
age = -1
if age >= 18:
print("恭喜你成年了, 可以网吧了")
elif age >=0 and age < 18:
print("对不起, 你还是个宝宝")
elif age == -1:
print("你输入的格式不正确")
抛出异常
def input_password():
pwd = input("请输入密码")
if len(pwd) >= 8 :
return pwd
ex = Exception("密码长度不够")
raise ex
try:
u_pwd = input_password()
print(u_pwd)
except Exception as result:
print(f"发现错误{result}")