Python的类和对象(3)
1、类的继承
父类:被继承
子类:继承者 – 可以使用父类的所有属性和方法、大大简化代码。
语法:在类名字后加上(继承的类名字)
# 定义类 -- 父类
class Car:
# 定义类属性
wheel = "有车轮"
engine = "有引擎"
# 初始化函数--特殊的实例方法
def __init__(self, cl="黑色", lg="奔驰"): # 定义函数的参数
print("正在生成一辆车....")
# 定义实例属性:
self.color = cl
self.logo = lg
# 定义实例方法
def run(self, light="白炽光"):
print("一辆车正在开....")
# 实例方法内,可以获取实例属性,也可以类属性 前面self.
print(f"正在开的这辆车颜色是:{self.color}, 车的引擎是:{self.engine}")
# 类里面调用:实例方法可以相互调用,self.实例方法名
# self.body = "有车身"
print(f"正在开的车车灯是:{light}")
self.recharge()
# 定义实例方法2
def recharge(self):
print("一辆车正在加油...")
print(f"正在加油车的颜色是:{self.color}")
# 定义类方法
@classmethod # 用来申明是一个类方法
def get_engine(cls): # cls在类里面表示类本身
print("这是一个类方法....")
print(f"车的引擎是:{cls.engine}") # 类方法可以获取类属性,不可以获取实例属性
# 定义类方法
@classmethod
def get_wheel(cls):
print("这是一个另外的类方法....")
cls.get_engine() # 类方法内部可以调用类方法--相互调用
# cls.recharge() # 类方法内部不可以调用实例方法的--报错
# 定义新的类 -- 子类,继承父类的一切
class NewEnergyCar(Car):
pass
# 实例化对象
new_car = NewEnergyCar()
# 继承后,子类可以使用父类的所有属性和方法
print(new_car.engine) # 类属性
print(new_car.color) # 实例属性
new_car.get_engine() # 类方法
new_car.recharge() # 实例方法
2、子类的方法和属性
子类也可以有自己的属性和方法,定义自己的实例方法
- 子类的对象可以调用子类的方法和属性
- 父类的对象不可以调用子类的方法和属性
3、问题: 子类和父类有相同的名字的方法,优先用谁的么?
- 优先使用子类自己的方法 ,就近原则。
- 如果想保留父类的同名方法的使用,可以使用超继承 super().同名方法,表示在子类调用父类的方法。
# 定义类 -- 父类
class Car:
# 定义类属性
wheel = "有车轮"
engine = "有引擎"
# 初始化函数--特殊的实例方法
def __init__(self, cl="黑色", lg="奔驰"): # 定义函数的参数
print("正在生成一辆车....")
# 定义实例属性:
self.color = cl
self.logo = lg
# 定义实例方法
def run(self, light="白炽光"):
print("一辆车正在开....")
# 实例方法内,可以获取实例属性,也可以类属性 前面self.
print(f"正在开的这辆车颜色是:{self.color}, 车的引擎是:{self.engine}")
# 类里面调用:实例方法可以相互调用,self.实例方法名
# self.body = "有车身"
print(f"正在开的车车灯是:{light}")
self.recharge()
# 定义实例方法2
def recharge(self):
print("一辆车正在加油...")
print(f"正在加油车的颜色是:{self.color}")
# 定义类方法
@classmethod # 用来申明是一个类方法
def get_engine(cls): # cls在类里面表示类本身
print("这是一个类方法....")
print(f"车的引擎是:{cls.engine}") # 类方法可以获取类属性,不可以获取实例属性
# 定义类方法
@classmethod
def get_wheel(cls):
print("这是一个另外的类方法....")
cls.get_engine() # 类方法内部可以调用类方法--相互调用
# cls.recharge() # 类方法内部不可以调用实例方法的--报错
# 定义新的类 -- 子类,继承父类的一切
class NewEnergyCar(Car):
# 子类的实例方法
def save_money(self):
self.battery = "有电池" # 子类的属性
print("新能源车可以省油钱...")
# 跟父类同名的方法
def recharge(self):
print("新能源车正在充电....")
super().recharge() # 表示在子类调用父类的方法。
4、
1、子类可以多层继承:爷爷-爸爸-孙子。
- 可以使用爷爷类、爸爸类的所有的属性和方法
2、子类可以多重继承:同时继承多个父类,那么拥有所有父类的方法和属性。
- 多个爸爸 Robot(NewEnergyCar,AutoCar)
- 多个爸爸类的所有的属性和方法
# 定义类 -- 爷爷类
class Car:
# 定义类属性
wheel = "有车轮"
engine = "有引擎"
# 初始化函数--特殊的实例方法
def __init__(self, cl="黑色", lg="奔驰"): # 定义函数的参数
print("正在生成一辆车....")
# 定义实例属性:
self.color = cl
self.logo = lg
# 定义实例方法
def run(self, light="白炽光"):
print("一辆车正在开....")
# 实例方法内,可以获取实例属性,也可以类属性 前面self.
print(f"正在开的这辆车颜色是:{self.color}, 车的引擎是:{self.engine}")
# 类里面调用:实例方法可以相互调用,self.实例方法名
# self.body = "有车身"
print(f"正在开的车车灯是:{light}")
self.recharge()
# 定义实例方法2
def recharge(self):
print("一辆车正在加油...")
print(f"正在加油车的颜色是:{self.color}")
# 定义类方法
@classmethod # 用来申明是一个类方法
def get_engine(cls): # cls在类里面表示类本身
print("这是一个类方法....")
print(f"车的引擎是:{cls.engine}") # 类方法可以获取类属性,不可以获取实例属性
# 定义类方法
@classmethod
def get_wheel(cls):
print("这是一个另外的类方法....")
cls.get_engine() # 类方法内部可以调用类方法--相互调用
# cls.recharge() # 类方法内部不可以调用实例方法的--报错
# 定义新的类 -- 爸爸类
class NewEnergyCar(Car):
# 子类的实例方法
def save_money(self):
self.battery = "有电池" # 子类的属性
print("新能源车可以省油钱...")
# 跟父类同名的方法
def recharge(self):
print("新能源车正在充电....")
super().recharge() # 表示在子类调用父类的方法。
# 定义自动驾驶车类 -- 另一个爸爸类
class AutoCar:
def auto(self):
print("这个车可自动驾驶")
# # 定义机器人类 -- 孙子类 -- 多层继承: 爷爷-爸爸-孙子
# class Robot(NewEnergyCar):
# pass
# # 实例化对象 Robot
# new_car = Robot()
#
# new_car.run()
# new_car.save_money()
# 定义机器人类 -- 孙子类 -- 多重继承,继承多个爸爸
class Robot(NewEnergyCar,AutoCar):
pass
# 实例化对象 Robot
new_car = Robot()
new_car.save_money()
new_car.auto()