继承
定义
创建类的时候并不都是从空白开始创建的,如果想创建的类是现有的类的特殊版本,那么就可以通过继承的手段进行处理,即一个类继承另一个类将自动获得另一个类的所有属性与方法,被继承的类称为父类,新类称为子类,而且子类还可以定义自己的属性和方法。
子类的创建
class Car():
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
def get_descriptive_name(self):
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()
class ElectricCar(Car):
def __init__(self,make,model,year):
super().__init__(make,model,year)
- 创建子类时,名称同样时大写字母开头,在类名后的括号内输入父类的名
- 创建子类时父类必须包含在当前文件中,并且位于子类前面
- 创建子类后首先需要给父类的所有属性赋值,因此需要父类__init__方法的帮助,在上述创建过程中使用了super()函数,其将父类与子类关联起来,故父类也称为超类,此时子类已将父类的属性和方法继承过来,子类可以开始定义属于自己的属性和方法。
子类属性和方法的定义
属性和方法的定义和之前的定义方法一致
class Car():
def __init__(self,make,model,year):
--snip-- # 省略
class ElectricCar(Car):
def __init__(self,make,model,year):
super().__init__(make,model,year)
self.battery_size = 70 # 新加子类属性电池尺寸
def describe_battery(self): # 新定义子类方法电池描述
print('this car has a ' + str(self.battery_size) + '-kwh battery')
重写父类的方法
如果父类中的方法对于子类而言毫无意义,可以在子类中对该方法进行重写,只要在子类中定义一个与父类名称相同的方法并对其进行处理即可,在调用时会直接忽略父类的定义,采用子类的定义。
class ElectricCar(Car):
--snip--
def fill_gas_tank(self):
print('this car does not need gas')
将实例(类)当作属性
在实际面向对象编程时,类的属性会非常多,比如电动汽车的各个组成部分还有各自的属性与方法,如果此时将这众多的属性与方法同时加进类的定义中就会显得十分繁杂,此时我们可以将一些类单独进行定义并将其用作电动汽车类的一个属性。
class Car():
def __init__(self,make,model,year):
--snip-- # 省略
class Battery(): # 新定义一个类,不从任何父类继承
def __init__(self,battery_size):
self.battery_size = battery_size
def describe_bettery(self):
print('this battery has a ' + str(self.battery_size) + '-kwh battery')
class ElectricCar(Car):
def __init__(self,make,model,year):
super().__init__(make,model,year)
self.battery = Battery() # 添加电池属性
my_tesla = ElectricCar('tesla','model x',2019)
my_tesla.battery.describe_bettery() # 调用形式
课后习题
9-6冰淇淋小店
class Restaurant():
def __init__(self,restaurant_name,cuisine_type):
self.restaurant_name = restaurant_name
self.cuisine_type = cuisine_type
class IceCreamStand(Restaurant):
def __init__(self,retaurant_name,cuisine_type,flavors): #将父类属性和新加的属性写入
super().__init__(restaurant,cuisine_type) # 继承父类属性
self.flavors = flavors # 创建子类属性
for flavor in flavors:
print(flavor)
icecream_list = ['apple','pineapple','banana']
icecream = IceCreamStand('tongfu','kezhan',icecream_list)
9-7管理员
class User():
--snip--
class Admin(User):
def __init__(self,first_name,last_name,privileges):
super().__init__(first_name,last_name)
self.privileges = privileges
def show_privileges(self):
for privilege in self.privileges:
print(privilege)
right = ['can add post','can delete','can ban user']
admin = Admin('kobe','brayant',right)
admin.show_privileges()
9-8权限
class User():
def __init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name
def describe_users(self):
print('first name is:' + self.first_name)
print('last name is:' + self.last_name)
def greet_user(self):
print('Hello ' + self.first_name + ' ' + self.last_name + ',time for returning money!')
class privileges(): # 定义类,使其当作子类的属性
def __init__(self,privileges):
self.privileges = privileges
def show_privileges(self):
for privilege in self.privileges:
print(privilege)
class Admin(User):
def __init__(self, first_name, last_name):
super().__init__(first_name, last_name)
self.privileges = privileges(right)
right = ['can add post', 'can delete', 'can ban user']
admin = Admin('kobe', 'brayant')
admin.privileges.show_privileges()
9-9电瓶升级
class Car():
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
class Battery():
def __init__(self, battery_size):
self.battery_size = battery_size
def upgrade_battery(self): # 电瓶设为默认值
if self.battery_size != 85:
self.battery_size = 85
def get_range(self,add): # 传递参数进行升级并打印
self.battery_size +=add
print(self.battery_size)
class ElectriCar(Car):
def __init__(self,make,model,year):
super().__init__(make,model,year)
self.battery = Battery(85) # 设定默认值为85
electriccar = ElectriCar('tesla','model x',2019)
electriccar.battery.get_range(0) # 打印升级前的值
electriccar.battery.upgrade_battery() # 改为默认值
electriccar.battery.get_range(55) # 打印升级后的值