.describe() python_跟我一起自学python语言 第9章 类(9.3.5 将实例用作属性)

今天继续自学 python的类。有条件的朋友要跟着敲代码啊。不然肯定是前面学后面忘。

喜欢python就关注冠山巡山使。 我将跟大家一块自学完python语言。

b027760d5cca250f1492c9d533668986.png

9.3.5 将实例用作属性

使用代码模拟实物时,你可能会发现自己给类添加的细节越来越多:属性和方法清单以及文
件都越来越长。在这种情况下,可能需要将类的一部分作为一个独立的类提取出来。你可以将大
型类拆分成多个协同工作的小类。
例如,不断给ElectricCar类添加细节时,我们可能会发现其中包含很多专门针对汽车电瓶
的属性和方法。在这种情况下,我们可将这些属性和方法提取出来,放到另一个名为Battery的
类中,并将一个Battery实例用作ElectricCar类的一个属性:
代码1(测试正常)

class Car():#Car类的代码"""一次模拟汽车的简单尝试"""def __init__(self, make, model, year):"""电动汽车的独特之处初始化父类的属性,再初始化电动汽车特有的属性"""self.make = makeself.model = modelself.year = yearself.odometer_reading = 0 self.battery_size = 70 #添加一个电瓶属性 def fill_gas_tank(self):"""这辆汽车有邮箱"""print("这个汽车有邮箱啊") def describe_battery(self):"""打印一条描述电瓶容量的消息"""print("This car has a " + str(self.battery_size) + "-kWh battery.")  def get_descriptive_name(self):long_name = str(self.year) + ' ' + self.make + ' ' + self.modelreturn 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 = mileageelse:print("You can't roll back an odometer!")def increment_odometer(self, miles):self.odometer_reading += milesclass Battery():"""新增代码1开始 一次模拟电动汽车电瓶的简单尝试"""def __init__(self,battery_size=70):"""初始化电瓶的属性"""self.battery_size=battery_sizedef describe_battery(self):"""打印一条描述电瓶容量的消息"""print("这个电瓶的容量是"+str(self.battery_size)+"千瓦时")"""新增代码1结束"""class ElectricCar(Car):#定义了子类ElectricCar,定义子类时必须在括号内指定父类的名称"""电动汽车的独特之处"""def __init__(self, make, model, year):#方法__init__()接受创建Car实例所需的信息"""初始化父类的属性"""super().__init__(make, model, year)"""新增代码2开始"""self.battery = Battery()#添加了一个名为self.battery的属性"""新增代码2结束"""def fill_gas_tank(self):"""电动车没有邮箱"""print("这个电动汽车不需要邮箱")my_tesla = ElectricCar('tesla', 'model s', 2016)#创建ElectricCar类的一个实例,并将其存储在变量my_tesla中print(my_tesla.get_descriptive_name())my_tesla.describe_battery()my_tesla.fill_gas_tank()"""新增代码3开始"""my_tesla.battery.describe_battery()"""实例my_tesla中查找属性battery 并调用Battery实例调用方法describe_battery()。 """"""新增代码3结束"""
0c1a9f2e412466ac64dfee005943c152.png
fb28f84e2104718a2bf75b9aec600829.png
0d6636c94b19455e1e9c9974966b5ad8.png

新增代码1处,我们定义了一个名为Battery的新类,它没有继承任何类。 方法__init__()除
self外,还有另一个形参battery_size。这个形参是可选的:如果没有给它提供值,电瓶容量将
被设置为70。方法describe_battery()也移到了这个类中。

在ElectricCar类中,我们添加了一个名为self.battery的属性(见新增代码2)。这行代码让Python
创建一个新的Battery实例(由于没有指定尺寸,因此为默认值70),并将该实例存储在属性
self.battery中。每当方法__init__()被调用时,都将执行该操作;因此现在每个ElectricCar实
例都包含一个自动创建的Battery实例。
我们创建一辆电动汽车,并将其存储在变量my_tesla中。要描述电瓶时,需要使用电动汽车
的属性battery:

my_tesla.battery.describe_battery()

这行代码让Python在实例my_tesla中查找属性battery,并对存储在该属性中的Battery实例
调用方法describe_battery()。
输出与我们前面看到的相同:

ce8bce94a2f162605ba347d47691d2b8.png

这看似做了很多额外的工作,但现在我们想多详细地描述电瓶都可以,且不会导致ElectricCar
类混乱不堪。下面再给Battery类添加一个方法,它根据电瓶容量报告汽车的续航里程:
代码2(测试正常)

class Car():#Car类的代码"""一次模拟汽车的简单尝试"""def __init__(self, make, model, year):"""电动汽车的独特之处初始化父类的属性,再初始化电动汽车特有的属性"""self.make = makeself.model = modelself.year = yearself.odometer_reading = 0 self.battery_size = 70 #添加一个电瓶属性 def fill_gas_tank(self):"""这辆汽车有邮箱"""print("这个汽车有邮箱啊") def describe_battery(self):"""打印一条描述电瓶容量的消息"""print("This car has a " + str(self.battery_size) + "-kWh battery.")  def get_descriptive_name(self):long_name = str(self.year) + ' ' + self.make + ' ' + self.modelreturn 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 = mileageelse:print("You can't roll back an odometer!")def increment_odometer(self, miles):self.odometer_reading += milesclass Battery():""" 一次模拟电动汽车电瓶的简单尝试"""def __init__(self,battery_size=70):"""初始化电瓶的属性"""self.battery_size=battery_sizedef describe_battery(self):"""打印一条描述电瓶容量的消息"""print("这个电瓶的容量是"+str(self.battery_size)+"千瓦时")"""新增代码1开始"""def get_range(self):"""打印一条消息,指出电瓶的续航里程"""if self.battery_size==70:#如果电瓶的容量为70kWhrange=240#它就将续航里程设置为240英里elif self.battery_size==85:#如果电瓶的容量为85kWhrange=270#它就将续航里程设置为270英里massage="这辆车大约能开"+str(range)#传递给massagemassage+="充满电后的里程数"print(massage)#打印massage"""新增代码1结束"""class ElectricCar(Car):#定义了子类ElectricCar,定义子类时必须在括号内指定父类的名称"""电动汽车的独特之处"""def __init__(self, make, model, year):#方法__init__()接受创建Car实例所需的信息"""初始化父类的属性"""super().__init__(make, model, year)self.battery = Battery()#添加了一个名为self.battery的属性def fill_gas_tank(self):"""电动车没有邮箱"""print("这个电动汽车不需要邮箱")my_tesla = ElectricCar('tesla', 'model s', 2016)#创建ElectricCar类的一个实例,并将其存储在变量my_tesla中print(my_tesla.get_descriptive_name())my_tesla.describe_battery()my_tesla.fill_gas_tank()my_tesla.battery.describe_battery()"""实例my_tesla中查找属性battery 并调用Battery实例调用方法describe_battery()。 """"""新增代码2开始"""my_tesla.battery.get_range()#实例my_tesla中查找属性battery并调用battery中的方法get_range()"""新增代码2结束"""

新增代码1处 新增的方法get_range()做了一些简单的分析:如果电瓶的容量为70kWh,它就将续航里
程设置为240英里;如果容量为85kWh,就将续航里程设置为270英里,然后报告这个值。为使用
这个方法,我们也通过汽车的属性battery来调用它(见新增代码2)。

8c4ae8a8f475f6e1d96d4811b9146503.png

新增代码1

5d1349d9a099855fe5e63ec88e45caa7.png

新增代码2

641baac365a5e68066a84339b2a2babd.png

输出

输出指出了汽车的续航里程(这取决于电瓶的容量):

这辆车大约能开240充满电后的里程数

我在代码中做了详细标记。每行代表什么意思。大家可以边看边练。记得要动手敲吆。敲了也不一定记住。但是学过以后用到的时候就知道在哪里找这个方法。

因为后面代码篇幅比较大。大家看起来也不便。所以自学教程我会分割的比较多些。

今天学到这里。明天继续 的学习

如果喜欢可以 点赞+关注冠山巡山使 or 评论+转发此文章让其他喜欢Python的同学看到吆 。明天见!

关注冠山巡山使+私信:“编辑器”三个字 就可以有这个编辑器的下载地址了。关注冠山巡山使+私信:“自学python”可以下载此教程!(我是参考此教程做的自学课程。大多数人儿只是下载下来。看完的很少。希望能跟我一块自学完!)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值