《Python编程:从入门到实践》学习打卡12-继承

继承

定义

创建类的时候并不都是从空白开始创建的,如果想创建的类是现有的类的特殊版本,那么就可以通过继承的手段进行处理,即一个类继承另一个类将自动获得另一个类的所有属性与方法,被继承的类称为父类,新类称为子类,而且子类还可以定义自己的属性和方法。

子类的创建

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)
  1. 创建子类时,名称同样时大写字母开头,在类名后的括号内输入父类的名
  2. 创建子类时父类必须包含在当前文件中,并且位于子类前面
  3. 创建子类后首先需要给父类的所有属性赋值,因此需要父类__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) # 打印升级后的值
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值