继承
如果看不懂建议从我发的第一篇开始看起,这些是一起的,我每天做一份笔记。
9.3.1子类的方法__init__()
electric_car.py
class Car():
'''一次模拟汽车的简单尝试'''
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
long_name = str(self.year)+' '+self.make+' '+self.model
return long_name.title()
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
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_descriptive_name())
#-------------------------------------------------------------
class Car():
'''一次模拟汽车的简单尝试'''
--snip--
#定义子类时,必须在括号内指定父类的名称。
class ElectricCar(Car):
'''电动汽车的独特之处'''
def __init__(self,make,model,year):
'''初始化父类的属性'''
super().__init__(make,model,year)
#super帮助父类和子类关联起来
'''
这行代码让Python调用ElectricCar的父类的方法__init__()
让ElectricCar实例包含父类的所有属性。
父类也称为超类(superclass),名称super因此而得名。
'''
#我的特斯拉 = 电动汽车
my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
9.3.3给子类定义属性和方法
class Car():
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
long_name = str(self.year)+' '+self.make+' '+self.model
return long_name.title()
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
class ElectricCar(Car):
'''Represent aspects of a car,specific to electric
vehicles.'''
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.")
my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
#-------------------------------------------------------------
class Car():
--snip--
class ElectricCar(Car):
'''Represent aspects of a car,specific to electric
vehicles.'''
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.")
'''这辆车有()千瓦时的电池'''
my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
如果一个属性或方法是任何汽车都有的,而不是电动汽车特有的,就应将其加入到Car类而不是ElectricCar类中。这样,使用Car类的人将获得相应的功能,而ElectricCar类只包含处理电动汽车特有属性和行为的代码。
9.3.4重写父类的方法
class Car():
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
long_name = str(self.year)+' '+self.make+' '+self.model
return long_name.title()
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):
'''Represent aspects of a car,specific to electric
vehicles.'''
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.")
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_descriptive_name())
my_tesla.describe_battery()
my_tesla.fill_gas_tank()
#-------------------------------------------------------------
class Car():
--snip--
class ElectricCar(Car):
--snip--
def fill_gas_tank():
'''电动车没有油箱'''
print('This car doesn`t need a gas tank!')
他这个重写父类的方法的意思大概是把()里的self去掉就好了,但是如果有人对电动汽车调用方法fill_gas_tank(),Python将忽略Car类中的方法fill_gas_tank(),转而运行上述代码。
然后还有一句话是
使用继承时,可让子类保留从父类那里继承而来的精华,并剔除不需要的糟粕。
我觉得作者说的就是如果子类和父类里出现了一样的那么系统用的就是子类的。
以后用多了应该就明白了。
9.3.5将实例用作属性
中间的那一条是风格线,上面的代码可以复制过来直接看结果,下面的代码是注释讲解的。
class Car():
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
long_name = str(self.year)+' '+self.make+' '+self.model
return long_name.title()
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 Battery():
'''一次模拟电动汽车的简单尝试'''
def __init__(self,battery_size=70):
'''初始化电瓶的属性'''
self.battery_size = battery_size
def describe_battery(self):
'''打印一条描叙电瓶容量的消息'''
print('This car 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 s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
#-----------------------------------------------------------
class Car():#汽车
--snip--
class Battery():#电池
'''一次模拟电动汽车的简单尝试'''
def __init__(self,battery_size=70):
'''初始化电瓶的属性'''
self.battery_size = battery_size
def describe_battery(self):
'''打印一条描叙电瓶容量的消息'''
print('This car 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()
'''将这些属性和方法提取出来,放到另一个名为Battery的类中,
并将一个Battery实例用作ElectricCar类的一个属性
'''
my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
#我的特斯拉.电池.描述电池()
我们定义了一个名为Battery的新类,它没有继承任何类。方法__init__()除self外,还有另一个形参battery_size。这个形参是可选的:如果没有给它提供值,电瓶容量将被设置为70。方法describe_battery()也移到了这个类中。
下面再给Battery类添加一个方法,它根据电瓶容量报告汽车的续航里程
class Car():
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
long_name = str(self.year)+' '+self.make+' '+self.model
return long_name.title()
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 Battery():
'''一次模拟电动汽车的简单尝试'''
def __init__(self,battery_size=70):
'''初始化电瓶的属性'''
self.battery_size = battery_size
def describe_battery(self):
'''打印一条描叙电瓶容量的消息'''
print('This car has a '+str(self.battery_size)+\
'-kWh battery.')
def get_range(self):
'''打印一条消息,指出电瓶的续航里程'''
if self.battery_size ==70:
range = 240
elif self.battery_size ==85:
range = 270
message = 'This car can go approximately '\
+str(range)
message += ' miles on a full charge.'
print(message)
class ElectricCar(Car):
'''电动汽车的独特之处'''
def __init__(self,make,model,year):
'''
初始化父类的属性,再初始化电动汽车特有的属性
'''
super().__init__(make,model,year)
self.battery = Battery()
my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()
#-----------------------------------------------------------
class Car():
--snip--
class Battery():#电池
--snip--
def get_range(self):#获取范围
'''打印一条消息,指出电瓶的续航里程'''
if self.battery_size ==70:
range = 240
elif self.battery_size ==85:
range = 270
message = 'This car can go approximately '\
+str(range)#这辆车大约能开。。。
message += ' miles on a full charge.'#英里,在充满电时
print(message)#打印(消息)
class ElectricCar(Car):#电动汽车
--snip--#剪断
my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
#打印(我的特斯拉.获取描述性名称())
my_tesla.battery.describe_battery()
#我的特斯拉.电池.描述电池()
my_tesla.battery.get_range()
#我的特斯拉.电池.获取范围()
方法get_range()做了一些简单的分析:如果电瓶的容量为70kWh,它就将续航里程设置为240英里;如果容量为85kWh,就将续航里程设置为270英里,然后报告这个值。为使用这个方法,我们也通过汽车的属性battery来调用它。
9.3.6模拟实物
模拟较复杂的物件(如电动汽车)时,需要解决一些有趣的问题。
续航里程是电瓶的属性还是汽车的属性呢?如果我们只需描述一辆汽车,那么将方法get_range()放在Battery类中也许是合适的;但如果要描述一家汽车制造商的整个产品线,也许应该将方法get_range()移到ElectricCar类中。
在这种情况下,get_range()依然根据电瓶容量来确定续航里程,但报告的是一款汽车的续航里程。我们也可以这样做:将方法get_range()还留在Battery类中,但向它传递一个参数,如car_model;在这种情况下,方法get_range()将根据电瓶容量和汽车型号报告续航里程。
动手试一试
9-6冰淇淋小店
class Restaurant():#餐厅
def __init__(self,restaurant_name,cuisine_type):#餐厅名称、菜肴类型
self.restaurant_name = restaurant_name
self.cuisine_type = cuisine_type
self.number_served = 0#服务人数
def describe_restaurant(self):#描述餐厅
print('My restaurant`s name is '\
+self.restaurant_name.title())
print('My restaurant makes '+self.cuisine_type)
def open_restaurant(self):#餐厅开张
print("The "+self.restaurant_name.title()\
+" restaurant is open.")
def set_number_served(self,number_served):#设置服务人数
self.number_served = number_served
print('number_served: '+str(self.number_served))
def increment_number_served(self,people):#增加服务人数
self.number_served += people
print('number_served: '+str(self.number_served))
class IceCreamStand(Restaurant):#冰淇淋摊
def __init__(self,restaurant_name,cuisine_type):
super().__init__(restaurant_name,cuisine_type)
def ice_cream_menu(self,flavors):#冰淇淋菜单;口味
flavorslist = ['Strawberry flavor','Chocolate flavor','sweetgrass flavor']
flavorslist.append(flavors)
print('Our ice cream tastes: ',flavorslist)
my_restaurant = IceCreamStand('ice ice good','ice cream')
my_restaurant.describe_restaurant()
my_restaurant.open_restaurant()
my_restaurant.ice_cream_menu('milk flavor')
不知道是不是这样,希望我没有理解错吧
9-7管理员
class User():
def __init__(user,first_name,last_name,gender,age,birthday):
user.first_name= first_name
user.last_name = last_name
user.gender = gender
user.age = age
user.birthday = birthday
user.login_attempts = 0
def describe_user(user):
print("First name: "+user.first_name.title())
print("Last name: "+user.last_name.title())
print("Gender: "+user.gender)
print("Age:"+str(user.age))
print("Your birthday: "+str(user.birthday))
def greet_user(user):
print("Hello "+user.first_name.title(),'Welcome to the world \
of Python.')
def increment_login_attempts(user,login_attempts):
user.login_attempts = login_attempts
user.login_attempts += 1
print("Login times: "+str(user.login_attempts))
def reset_login_attempts(user):
user.login_attempts = 0
print("The number of logins has been reset! "\
+str(user.login_attempts))
class Admin(User):#管理员(用户)
def __init__(user,first_name,last_name,gender,age,birthday):
super().__init__(first_name,last_name,gender,age,birthday)
def show_privileges(user,privileges):#显示特权(用户,特权)
privileges_list = ['can delete post','can banuser']
privileges_list.insert(0,privileges)
print("Show privileges: "+str(privileges_list))
user_profile = Admin('angel','devil','girl',16,9.2)
user_profile.greet_user()
user_profile.describe_user()
user_profile.show_privileges('can add post')
应该是这样,如果我没理解错的话,你们也可以看看别人的,我看见这上面好多人都挺喜欢这本书的,做题目的也不少。
9-8权限
class User():
def __init__(user,first_name,last_name,gender,age,birthday):
user.first_name= first_name
user.last_name = last_name
user.gender = gender
user.age = age
user.birthday = birthday
user.login_attempts = 0
#描述用户
def describe_user(user):
print("First name: "+user.first_name.title())
print("Last name: "+user.last_name.title())
print("Gender: "+user.gender)
print("Age:"+str(user.age))
print("Your birthday: "+str(user.birthday))
#欢迎用户
def greet_user(user):
print("Hello "+user.first_name.title(),'Welcome to the world \
of Python.')
#增加登录次数
def increment_login_attempts(user,login_attempts):
user.login_attempts = login_attempts
user.login_attempts += 1
print("Login times: "+str(user.login_attempts))
#重置登陆尝试次数
def reset_login_attempts(user):
user.login_attempts = 0
print("The number of logins has been reset! "\
+str(user.login_attempts))
class Privileges():#特权
def __init__(user,privileges=[]):
user.privileges = privileges
def show_privileges(user):#显示特权(用户)
print("Show privileges: "+str(user.privileges))
class Admin(User):#管理员(用户)
def __init__(user,first_name,last_name,gender,age,birthday):
super().__init__(first_name,last_name,gender,age,birthday)
user.privileges = Privileges()
vip_user = Admin('angel','devil','girl',16,9.2)
vip_user.privileges.privileges = ['can add post','can delete post','can banuser']
vip_user.privileges.show_privileges()
9-9电瓶升级
class Car():
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
long_name = str(self.year)+' '+self.make+' '+self.model
return long_name.title()
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
class Battery():
'''一次模拟电动汽车的简单尝试'''
def __init__(self,battery_size=70):
'''初始化电瓶的属性'''
self.battery_size = battery_size
def describe_battery(self):
'''打印一条描叙电瓶容量的消息'''
print('This car has a '+str(self.battery_size)+\
'-kWh battery.')
def get_range(self):
'''打印一条消息,之处电瓶的续航里程'''
if self.battery_size ==70:
range = 240
elif self.battery_size ==85:
range = 270
message = 'This car can go approximately '\
+str(range)
message += ' miles on a full charge.'
print(message)
def upgrade_battery(self):#升级电池
if self.battery_size <85:
self.battery_size = 85
else:
self.battery_size = self.battery_size
class ElectricCar(Car):
'''电动汽车的独特之处'''
def __init__(self,make,model,year):
'''
初始化父类的属性,再初始化电动汽车特有的属性
'''
super().__init__(make,model,year)
self.battery = Battery()
my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()
my_tesla.battery.upgrade_battery()
my_tesla.battery.get_range()
课后练习是我自己对题目的一个理解,运行是可以运行起来的,但有些地方可能会理解错误,仅供参考,如果有什么建议可以在下方评论区留言。