"""
第9章 类
"""# 9.1.1 创建Dog类"""
类中的函数称为方法
Python调用__init__()方法创建Dog实例时,将自动传入实参self
self是一个指向实例本身的引用,让实例能够访问类中的属性和方法
"""classDog():"""一次模拟小狗的简单尝试"""# 方法__init__()是一个特殊方法,故不可改变def__init__(self,name,age):#约定前后各有两根线"""初始化属性的name和age"""
self.name = name
self.age = age
defsit(self):"""模拟小狗被命令时蹲下"""print(self.name.title()+" is now sitting.")defroll_over(self):"""模拟小狗被命令时打滚"""print(self.name.title()+" rolled over! ")# 9.1.2 根据类创建实例
my_dog = Dog('willie',6)print("My dog's name is "+ my_dog.name.title()+".")print("My dog is "+str(my_dog.age)+" years old.")
my_dog.sit()# 实例名称.调用方法
my_dog.roll_over()# 9.2.1 Car 类classCar():"""一次模拟汽车的简单尝试"""def__init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
defget_descriptive_name(self):"""返回整洁的描述性信息"""
long_name =str(self.year)+' '+ self.make +' '+self.model
return long_name.title()
my_new_car = Car('audi','a4',2016)print(my_new_car.get_descriptive_name())# 9.2.2 给属性指定默认值"""类中每个属性必须有初始值,哪怕是0或者空字符串"""classCar():def__init__(self,make,model,year):"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading =0# 指定默认值defget_descriptive_name(self):"""返回整洁的描述性信息"""
long_name =str(self.year)+' '+ self.make +' '+self.model
return long_name.title()defread_odometer(self):"""打印一条指出汽车里程的消息"""print("This car has "+str(self.odometer_reading)+" miles on it.")defupdate_odometer(self,mileage):"""
将里程表读数设置为指定值
禁止将里程表读书往回调
"""if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:print("You can't roll back an odometer !")
my_new_car = Car('audi','a4',2016)print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading =23# 1.直接改属性值
my_new_car.read_odometer()
my_new_car.update_odometer(49)# 2.通过方法修改属性值
my_new_car.read_odometer()# 9.3 继承classCar():# 父类"""一次模拟汽车的简单尝试"""def__init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odometer =0defget_descriptive_name(self):
long_name =str(self.year)+' '+ self. make +' '+ self.model
return long_name
defread_odometer(self):print("This car has "+str(self.odometer_reading)+" miles on it")defupdate_odometer(self,mileage):# 禁止里程表回调if mileage >= self.odometer:
self.odemeter = mileage
else:print("You can't roll back an odometer !")defincrement_odometer(self,miles):
self.odometer_reading += miles
deffill_gas_tank(self):# 9.3.4用例"""油箱"""print("zzzz")classElectricCar(Car):# 子类"""电动汽车的独特之处"""def__init__(self,make,model,year):# 接受创建Car实例所需的信息"""初始化父类属性"""# 父类也称为超类(superclass)super().__init__(make,model,year)# super()帮助Python将父类和子类关联起来
self.battery_size =70# 添加一个新属性defdescribe_battery(self):# 添加一个新方法"""打印一条描述电瓶容量的消息"""print("This car has a "+str(self.battery_size)+"-kwh battery.")# 9.3.4 重写父类的方法"""
父类的方法,有可能对继承的子类并没有用,则可进行重写
可在子类定义一个与父类方法同名的方法,调用时Python只关注子类不会关注父类
"""# 注:此处""""""注释也需要缩进,不然会报错deffill_gas_tank(self):"""电动车没有油箱"""print("This car doesn't need a gas tank !")
my_tesla = ElectricCar('tesla','model s',2016)# 创建一个实例并存储在my_tesla中print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()# 9.3.5 将实例用作属性"""
使用代码模拟食物时,给类添加的细节越多,属性和方法清单就越多,因而可以
将大型的类拆分成多个协同工作的小类
例如:不断给ElectricCar添加细节时,可能会包含汗多针对汽车电瓶的属性和
方法。这种情况下,可以将属性方法提取出来,放到另一个名为Battery的类中
并将一个Battery实例用作ElectricCar类的一个属性
"""classCar():# 父类--snip--classBattery():# 定义一个新类,不继承任何类"""一次模拟电动汽车电瓶的简单尝试"""def__init__(self,battery_size=70):"""初始化电瓶的属性"""
self.battery_size = battery_size
defdescribe_battery(self):"""打印一条描述电瓶容量的消息"""print("This car has a "+str(self.battery_size)+"-kwh battery.")defget_range(self):"""打印一条消息,指出电瓶的续航里程"""if self.battery_size ==70:range=240elif self.battery.size ==85:range=270
message ="This car can go approximately "+str(range)
message +=" miles on a full charge."print(message)classElectricCar(Car):# 每个ElectricCar实例都包含一个自动创建的Battery实例"""电动汽车的独特之处"""def__init__(self,make,model,year):"""
初始化父类的属性,再初始化电动汽车特有的属性
"""super().__init__(make,model,year)# 添加一个self.battery属性,这行代码让Python创建一个新的Battery实例
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()# 9.4 导入模块,模块中的类"""一个可用于表示汽车的表"""# ⬆创建的每个模块都应该编写文档字符串classCar():"""一次模拟汽车的简单尝试"""def__init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odometer =0defget_descriptive_name(self):"""返回整洁的描述性名称"""
long_name =str(self.year)+' '+ self. make +' '+ self.model
return long_name
defread_odometer(self):"""打印一条消息,指出汽车的里程"""print("This car has "+str(self.odometer_reading)+" miles on it")defupdate_odometer(self,mileage):# 禁止里程表回调if mileage >= self.odometer:
self.odemeter = mileage
else:print("You can't roll back an odometer !")defincrement_odometer(self,miles):"""将里程表读数增加指定的量"""
self.odometer_reading += miles
classBattery():# 定义一个新类,不继承任何类"""一次模拟电动汽车电瓶的简单尝试"""def__init__(self,battery_size=70):"""初始化电瓶的属性"""
self.battery_size = battery_size
defdescribe_battery(self):"""打印一条描述电瓶容量的消息"""print("This car has a "+str(self.battery_size)+"-kwh battery.")defget_range(self):"""打印一条消息,指出电瓶的续航里程"""if self.battery_size ==70:range=240elif self.battery.size ==85:range=270
message ="This car can go approximately "+str(range)
message +=" miles on a full charge."print(message)classElectricCar(Car):# 每个ElectricCar实例都包含一个自动创建的Battery实例"""电动汽车的独特之处"""def__init__(self,make,model,year):"""
初始化父类的属性,再初始化电动汽车特有的属性
"""super().__init__(make,model,year)# 添加一个self.battery属性,这行代码让Python创建一个新的Battery实例
self.battery = Battery()"""
保存一个名为car.py的模块 内容如上
新建一个py 内容如下
"""from car import Car # 文件名 类名
my_new_car = Car('audi','a4',2016)print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading =23
my_new_car.read_odometer()"""
from car import Car,ElectricCar 从一个模块导入多个类
import car 导入整个模块
from car import * 导入模块中所有类
"""# 9.5 Python 标准库from collections import OrderedDict # 标准库
fav = OrderedDict()# 调用 OrderedDict创建一个空的有序字典
fav['jj']='oython'
fav['ss']='cc'
fav['chk']='ruby'for name,lag in fav.items():print(name.title())print(lag.title())from random import randint
x = randint(1,6)# 返回1-6范围内的一个整数print(x)# 9.6 类编码风格"""
1.类名应采用驼峰命名法,类名每个单词首字母大写,不使用下划线
2.实例名,模块名都应采用小写格式,单词之间加下划线
3.每个类,类定义后应有文档字符串。描述类的功能。
4.每个模块也应有文档字符串,进行作用描述
5.一个空行分隔方法,两个空行分隔类
6.同时调用标准库模块和自己模块时,先导入标准,并添加一个空行
例子如下(不可执行)
"""from collections import OrderedDict # 6.标准库中的模块from car import Car # 6.自己定义的模块classCar():"""一次模拟汽车的简单尝试"""def__init__(self,make,model,year):
self.make = make
# 5.类之间两个空行classCarBattery():# 1.类名采用驼峰命名法"""一次模拟电动汽车电瓶的简单尝试"""# 3.类后跟文档字符串def__init__(self,battery_size=70):"""初始化电瓶的属性"""# 4.模块也要有文档字符串
self.battery_size = battery_size
defdescribe_battery(self):# 2.模块名采用小写下划线"""打印一条描述电瓶容量的消息"""print("This car has a "+str(self.battery_size))