1 继承
定义:如果编写的一个类是另一个类的特殊版本,可以使用继承。(即类不是从空白开始写)
父类(超类):一个类继承另一个类时,它将自动获得另一个类的所有属性和方法,原有类称父类
子类:新类称为子类
子类继承了父类所有的属性和方法,同时还可以定义自己属性和方法
1.1 子类的方法__init__()
创建子类实例之前,python需要给父类的所有属性赋值,子类__init__()需要父类帮助
# 父类
class Car():
"""一次模拟汽车的简单测试"""
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_describle_name(self):
long_name = str(self.year) + " " + self.make + " " + self.model
return long_name
def read_odometer(self):
print("This car has " + str(self.odometer_reading) + ' miles on it.')
def update_odometer(self,mileage):
if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:
print("You can't roll back an odometer!")
def increment_odometer(self,miles):
self.odometer_reading += miles
def fill_gas_tank(self):
"""电动车没有油箱"""
print("This car doesn't need a gas tank!")
# 子类
class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self, make, model, year):
"""初始化父类的属性"""
super().__init__(make, model, year)
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_describle_name())
子类
class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self, make, model, year):
"""初始化父类的属性"""
super().__init__(make, model, year)
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_describle_name())
结果:
2016 tesla model
super()特殊函数:帮助python将父类和子类关联起来,让子类具有父类的属性。
在Python中,super函数用于调用父类的方法。它的语法如下:
super([type[, object-or-type]])
其中,type是子类的类型,object-or-type是子类的实例或类型。如果省略type和object-or-type,则super函数会返回一个未绑定的超类方法对象,可以用于调用父类的未绑定方法。
需要注意的是,super函数只能用于调用父类的实例方法,而不能用于调用父类的类方法和静态方法。此外,如果父类中存在多个同名方法,super函数只会调用其第一个找到的方法。
类的类方法:
在Python中,类方法是一种特殊的方法,它与类本身而不是类的实例相关联。类方法使用@classmethod装饰器进行修饰,它的第一个参数通常被命名为cls,用于表示类本身。类方法可以在类的实例和类本身上进行调用。
需要注意的是,super函数只能用于调用父类的实例方法,而不能用于调用父类的类方法和静态方法。此外,如果父类中存在多个同名方法,super函数只会调用其第一个找到的方法。
类的类方法:
1.2 给子类定义属性和方法
子类
class ElectricCar(Car):
"""
电动汽车的独特之处
初始化父类的属性,再初始化电动汽车特有的属性
"""
def __init__(self, make, model, year):
"""初始化父类的属性"""
super().__init__(make, model, year)
# 添加子类属性
self.battery_size = 70
# 添加子类方法
def describle_battery(self):
"""打印一条描述电瓶容量的消息"""
print("This car has a " + str(self.battery_size) + "-KWh battery.")
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_describle_name())
my_tesla.describle_battery()
结果:
2016 tesla model s
This car has a 70-KWh battery.
总结:如果一个属性或者方法是所有类都有的,
将其放在父类里面,只有子类有的属性和方法放在子类里面
1.3 重写父类的方法
重写时机:父类的方法不符合子类模拟的实物行为,就考虑重写父类方法
如果父类方法名与子类方法名重合,python只考虑子类中定义的方法
子类
class ElectricCar(Car):
"""
电动汽车的独特之处
初始化父类的属性,再初始化电动汽车特有的属性
"""
def __init__(self, make, model, year):
"""初始化父类的属性"""
super().__init__(make, model, year)
# 添加子类属性
self.battery_size = 70
# 添加子类方法
def describle_battery(self):
"""打印一条描述电瓶容量的消息"""
print("This car has a " + str(self.battery_size) + "-KWh battery.")
def fill_gas_tank(self):
"""电动车没有油箱"""
print("This car doesn't need a gas tank!")
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_describle_name())
my_tesla.describle_battery()
my_tesla.fill_gas_tank()
结果:
2016 tesla model s
This car has a 70-KWh battery.
This car doesn't need a gas tank!
1.4 将实例属性作属性
将某一类属性或者方法挑选出来放到一个类里面
将共有的电瓶功能区挑选出来作为一个类:
class Battery():
"""一次模拟电动车电瓶的简单尝试"""
def __init__(self,battery_size = 70):
"""初始化电瓶属性"""
self.battery_size = battery_size
def describle_battery(self):
"""打印一条描述电瓶容量的消息"""
print("This car has a " + str(self.battery_size) + "-KWh battery.")
def get_range(self):
"""打印一条消息,指出电瓶的续航里程"""
if self.battery_size == 70:
ranges = 240
elif self.battery_size == 85:
ranges = 270
message = "The" + "car can go apporoximately " + str(ranges)
message += " miles on full charge."
print(message)
class ElectricCar(Car):
"""电动车的独特之处"""
def __init__(self, make, model, year):
"""
初始化父类的属性,再初始化电动汽车特有的属性
"""
super().__init__(make,model,year)
self.battery = Battery() # 将Battery类作为子类属
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_describle_name())
my_tesla.battery.describle_battery()
my_tesla.battery.get_range()
结果:
2016 tesla model s
This car has a 70-KWh battery.
Thecar can go apporoximately 240 miles on full charge.
总结:
1、父类:最先创建的类 ; 子类:后面创建的类
2、子类方法的创建:
初始化父类参数:def init(self,父类中参数列表):
super().init(父类参数)
子类参数定义
3、子类参数定义 紧接着父类参数后面一行写:self.子类参数名 = 初始值
4、重写父类方法:适用场合父类和子类都有的行为,
5、将实例作属性:即将对象共有的属性和方法包装在一个类中,然后将这个类的对象实例化作为类的属性。