第9 章 类 _9.3 继承

# -*- coding:utf-8 -*-
#li hongliang 2020年06月14日
#9.3 继承
#一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
#9.3.1 子类的方法__init__():创建子类的实例时,Python首先需要完成的任务是给父类的所有属性赋值。为此,子类的方法__init__()需要父类施以援手。
#9.3.2 Python 2.7 中的继承:函数super()需要两个实参:子类名和对象self。为帮助Python将父类和子类关联起来,这些实参必不可少。另外,在Python 2.7中使用继承时,务必在定义父类时在括号内指定object。
#9.3.3 给子类定义属性和方法:让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法。
#9.3.4 重写父类的方法:对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名。这样,Python将不会考虑这个父类方法,而只关注你在子类中定义的相应方法。使用继承时,可让子类保留从父类那里继承而来的精华,并剔除不需要的糟粕。
#9.3.5 将实例用作属性:使用代码模拟实物时,你可能会发现自己给类添加的细节越来越多:属性和方法清单以及文件都越来越长。在这种情况下,可能需要将类的一部分作为一个独立的类提取出来。你可以将大型类拆分成多个协同工作的小类。
#9.3.6 模拟实物

#9-6 冰淇淋小店:冰淇淋小店是一种特殊的餐馆。编写一个名为IceCreamStand 的
#类,让它继承你为完成练习9-1 或练习9-4 而编写的Restaurant 类。这两个版本的
#Restaurant 类都可以,挑选你更喜欢的那个即可。添加一个名为flavors 的属性,用于
#存储一个由各种口味的冰淇淋组成的列表。编写一个显示这些冰淇淋的方法。创建一个
#IceCreamStand 实例,并调用这个方法。

#9-4示例基础上开发
class Restaurant():
    def __init__(self,restaurant_name,cuisine_type):  #cuisine_type:烹饪类型
        """初始化属性name和age"""
        self.restaurant_name = restaurant_name
        self.cuisine_type = cuisine_type
        self.number_served = 0        #就餐人数初始值为0
    
    def describe_restaurant(self):
        print('Restaurant_name is ' + self.restaurant_name.title())
        print('Cuisine_type is ' + self.cuisine_type )

    def open_restaurant(self):
        print(self.restaurant_name.title()+ ' is openning')
    
    def number_diners(self):
        '''打印有多少人在这家餐馆就餐过'''
        print(self.restaurant_name.title()+ 'number of diners are '+ str(self.number_served) )
    
    def set_number_served(self,number):
        '''这只餐馆就餐人数'''
        self.number_served = number
        if number >= self.number_served:
            self.number_served = number
        else:
            print("You can't roll back an number!")
    def increment_number_served(self,increment):
        '''新增就餐人数若干'''
        self.number_served += increment

#子类
class IceCreamStand(Restaurant):
    def __init__(self,restaurant_name,cuisine_type,flavors):
        super().__init__(restaurant_name,cuisine_type)
        self.flavors=flavors
    def describe_iceCream(self):
        for flavor in self.flavors:
            #print(flavor)
            print('This iceCream flavor is '+ flavor.title())

#restaurant1 = Restaurant('Bottom fishing','Boiled')
#restaurant1.number_diners()
#flavors=['sweet','Chocolates','fruit']
iceCream = IceCreamStand('Hagendas','freezing',['sweet','Chocolates','fruit'])
iceCream.describe_restaurant()   #使用print(iceCream.describe_restaurant()会多打印一个None)
iceCream.describe_iceCream()


#9-7 管理员:管理员是一种特殊的用户。编写一个名为Admin 的类,让它继承你为
#完成练习9-3 或练习9-5 而编写的User 类。添加一个名为privileges 的属性,用于存
#储一个由字符串(如"can add post"、"can delete post"、"can ban user"等)组成的
#列表。编写一个名为show_privileges()的方法,它显示管理员的权限。创建一个Admin
#实例,并调用这个方法。

#9-5示例基础上开发
class User():
    def __init__(self,first_name,last_name,login_attempts,**user_info):
        """包含用户姓与名及其它几个属性"""
        self.name = {}     #定义空字典
        self.first_name = first_name
        self.last_name = last_name
        self.login_attempts = login_attempts
        for k,v in user_info.items():
            self.name[k]= v   #将所有字典值赋值给字典name,其实姓名也可以赋值到这个字典里面
    def describe_user(self):
        '''打印用户信息摘要'''
        print('以下为用户的基本信息: ')
        self.fullname = self.first_name + self.last_name
        print('姓名:'+ self.fullname)
        for key,value in self.name.items():  #使用字典里面的信息
            print( key + ': '+str(value))
    
    def greet_user(self):
        print(self.first_name.title() + self.last_name.title() +' Welcome to join us')
    
    def increment_login_attempts(self):
        self.fullname = self.first_name + self.last_name
        self.login_attempts += 1
        print(self.fullname.title() + ' 尝试登录次数是'+ str(self.login_attempts) + '次' )
    
    def reset_login_attempts(self):
        self.fullname = self.first_name + self.last_name
        self.login_attempts = 0
        print('重置用户 '+self.fullname.title() + '登录次数为'+ str(self.login_attempts) + '次')

"""print('\n')
user = User('li','jia',0,occupation='test',phone='13202973253')
user.increment_login_attempts()
user.increment_login_attempts()
user.increment_login_attempts()
user.increment_login_attempts()  #调用方法increment_login_attempts()4次

user.reset_login_attempts()      #重置用户登录次数 """

class Admin(User):
    def __init__(self,first_name,last_name,login_attempts,privileges,**user_info):
        super().__init__(first_name,last_name,login_attempts,**user_info)
        self.privileges = privileges
    def show_privileges(self):
        print('The administrator has the following permissions :')
        for privilege in self.privileges: 
            print(privilege.title())
print('\n')
admin1 = Admin('li','quan','1',["can add post","can delete post","can ban user","Can add users","Users can be deleted"],occupation='test',phone='13202973253')
admin1.show_privileges()


#9-8 权限:编写一个名为Privileges 的类,它只有一个属性——privileges,其中
#存储了练习9-7 所说的字符串列表。将方法show_privileges()移到这个类中。在Admin
#类中,将一个Privileges 实例用作其属性。创建一个Admin 实例,并使用方法
#show_privileges()来显示其权限。
#9-9 电瓶升级:在本节最后一个electric_car.py 版本中,给Battery 类添加一个名为
#upgrade_battery()的方法。这个方法检查电瓶容量,如果它不是85,就将它设置为85。
#创建一辆电瓶容量为默认值的电动汽车,调用方法get_range(),然后对电瓶进行升级,
#并再次调用get_range()。你会看到这辆汽车的续航里程增加了。

版权声明:本文为m0_47456600原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。