继承:
继承是一种创建新类的方式,当子类需要复用父类的属性或者方法时,就可以使用继承。同样,子类也可以提供自己的属性和方法
继承分为——单继承、多继承
继承作用:避免重复造轮子,导致代码冗余
在 Python3 当中,全部都是新式类,默认继承 object
单继承:子类继承父类,可以直接享受父类中已经封装好的方法。
注意:
1、单继承:深度优先
2、重写:防止执行父类当中的方法
3、self永远指的是执行该方法的调用者
4、super(当前类, self).父类中的方法(arg)
多继承:所谓多继承,即子类有多个父类,并且具有它们的特征。
python支持多继承:
- 1、左边优先
- 2、一条道路走到底
- 3、同一个根时,根最后执行
多态:
python本身就是动态语言。
多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚"鸭子类型"
动态语言调用实例方法时不检查类型,只要方法存在,参数正确,就可以调用。这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。
所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态。
魔法方法:
在Python中,有一些内置好的特定方法,这些方法在进行特定的操作时会自动被调用,称为魔法方法。
魔法方法的命名总是被双下划线包围,比如__名称__
常用魔法方法:
init
str
mro
main
doc :用来查看类的说明文档
module:查看当前类所在模块
class:查看所属对象
dict:用于获取类或者实例的属性字典
dir():列表,返回所有的成员(dict__更倾向于__dir()的子集
del():叫做析构方法。当由该类创建的实例对象,被删除或者说在内存中被释放,将会自动触发执行。
call():用于将对象变成一个可调用的对象。也就是说,当一个类中有__call__()方法时,其实例化得到的对象便是可调用的(callable)
new():用于创建与返回一个对象。在类准备将自身实例化时调用。
练习一:
"""
士兵老Amy有一把枪(AK47),
士兵可以开火
枪能够发射子弹
枪能够添加子弹
枪类: 属性:型号,子弹数量 行为:发射子弹,添加子弹
士兵类:
属性:士兵名称,枪支
行为:开火行为(需考虑到:是否有枪支?以及添加子弹,发射子弹)
"""
class Gun(object):
def __init__(self):
self.model = None
self.bullet_num = 0
self.max_bullet_num = 0
def __str__(self):
return f"枪支型号:{self.model}, 当前子弹数量:{self.bullet_num}, 最大子弹数量:{self.max_bullet_num}"
def Charater(self, model, bullet_num, max_num):
self.model = model
self.bullet_num = bullet_num
self.max_bullet_num = max_num
def __Addition(self, number):
addition = input("是否添加子弹:Y/N:")
max_bullet_num = self.max_bullet_num
if addition.upper() == 'Y':
Add = number
New_bullet_num = self.bullet_num + Add
if New_bullet_num <= max_bullet_num:
self.bullet_num = New_bullet_num
print(f"添加子弹成功,当前子弹数为{self.bullet_num}")
elif New_bullet_num > max_bullet_num:
print("子弹添加数量超过最大值")
else:
print("输入错误")
def active(self, number = 0):
if self.bullet_num > 0 and self.bullet_num <= self.max_bullet_num:
print(f"{self.model}有子弹,可发射子弹")
shooting = input("是否发射子弹:Y/N")
if shooting.upper() == 'Y':
self.bullet_num -= 1
else:
self.bullet_num -= 0
self.__Addition(number)
elif self.bullet_num == 0:
print("空枪,无法发射子弹")
self.__Addition(number)
else:
print("子弹数目有误")
class Soldier(object):
gun = Gun()
gun_model = input("请输入枪支类型:")
gun_bullet_num = int(input("请输入当前子弹数:"))
gun_max_bullet_num = int(input("请输入最大子弹数:"))
gun.Charater(gun_model, gun_bullet_num, gun_max_bullet_num)
print(gun)
def __init__(self, name=None):
self.name = name
def active(self):
if self.name is None:
print("连人都没有,打什么打")
else:
if Soldier.gun_model is None:
print("连枪都没有,打什么打")
else:
while True:
if Soldier.gun_bullet_num == 0:
print("连子弹都没有,打什么打")
bullet_num = int(input("请输入添弹数量(0-6):"))
Soldier.gun.active(bullet_num)
Soldier.gun_bullet_num = Soldier.gun_bullet_num + bullet_num
continue
else:
print("开火!开火!!")
Soldier.gun.active()
Fight = input("继续战斗吗?Y/N:")
if Fight.upper() == "Y":
continue
else:
break
break
if __name__ == '__main__':
solider = Soldier(input("请输入士兵名称:"))
solider.active()
练习二:
"""
车类1:
属性:颜色,轮子个数(默认4个),重量级,速度(默认为0)
行为:加速,减速,停车
车类2:
属性:在基于车类1的基础上,添加一些比如:牌子,型号,空调系统等
行为:覆盖车类1的加速与减速,打印输出车辆信息
"""
class Vehicle_1(object):
def __init__(self, color=None, weight=None, tyres = 4, speed = 0):
self.color = color
self.tyres = tyres
self.weight = weight
self.speed = speed
@ staticmethod
def accelerate():
print("汽车加速!")
@ staticmethod
def decelerate():
print("汽车减速!")
@ staticmethod
def stop():
print("停车!")
class Vehicle_2(Vehicle_1):
def __init__(self, brand, model, air_conditioner, color=None, weight=None, tyres=4, speed=0):
self.brand = brand
self.model = model
self.air_conditioner = air_conditioner
super().__init__(color, weight, tyres, speed)
def accelerate(self, upper_speed):
speed_upper = upper_speed
print(f"{self.brand}加速{speed_upper}")
self.speed += speed_upper
print(f"当前车速{self.speed}")
def decelerate(self, low_speed):
speed_lower = low_speed
print(f"{self.brand}减速{speed_lower}")
self.speed -= speed_lower
print(f"当前车速{self.speed}")
def __str__(self):
return f"车牌:{self.brand}\n型号:{self.model}\n空调系统:{self.air_conditioner}\n颜色:{self.color}\n重量:{self.weight}\n轮胎数:{self.tyres}\n速度:{self.speed}"
if __name__ == '__main__':
Car = Vehicle_2("京A8888", 'X3', '自动调节', '宝石蓝', 5, 4, 80)
print(Car)
Car.accelerate(20)
Car.decelerate(10)