(class),并基于这些类来创建对象(object)。在编写类时,你要定义一批对象根据类来创建对象称为实例化,这让你能够使用类的实例(instance)。
目录
📢:父类必须包含在当前文件中,且位于子类前面。📢:super()
创建和使用类
创建Dog类
根据Dog类创建的每个实例都将存储名字和年龄,而且我们会赋予每条小狗坐下(sit())和打滚(roll_over())的能力:
📢:具体注意事项体现在代码注释中
lass Dog:#根据约定,在Python中,首字母大写的名称指的是类。
"""一次模拟小狗的简单尝试"""
#因为这是我们创建的全新的类,所以定义时不加括号。然后是一个文档字符串,对这个类的功能做了描述。
def __init__(self, name, age): #类中的函数称为方法。
#__init__()方法定义成包含三个形参:self、name和age。在这个方法的定义中,形参self必不可少,而且必须位于其他形参的前面。
#每当我们根据Dog类创建实例时,都只需给最后两个形参(name和age)提供值。
"""初始化属性name和age"""
self.name = name#像这样可通过实例访问的变量称为属性(attribute)。
self.age = age
def sit(self):
"""模拟小狗收到命令时坐下"""
print(f"{self.name} is now sitting.")
def roll_over(self):
"""模拟小狗收到命令时打滚"""
print(f"{self.name} rolled over!")
根据类创建实例
my_dog = Dog('Willie', 6)
print(f"My dog's name is {my_dog.name}.")
print(f"My dog is {my_dog.age} years old.")
#在这里,命名约定很有用:通常可以认为首字母大写的名称(如Dog)指的是类,而全小写的名称(如my_dog)指的是根据类创建的实例。
my_dog.roll_over()
my_dog.sit()
使用类和实例
类编写好后,你的大部分时间将花在使用根据类创建的实例上。你需要完成的首要任务之一是,修改实例的属性。既可以直接修改实例的属性,也可以编写方法以特定的方式进行修改。
接下来会以car.py中创建Car的类 在注释中来体现一下具体内容的使用
-
给属性指定默认值
-
修改属性的值
-
直接修改属性的值
-
通过方法修改属性的值
在类中写update_odometer(self, mileage):方法,在类外调用方法来改属性的值
-
通过方法让属性的值递增
-
lass 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 = f"{self.year} {self.make} {self.model}"
return long_name.title()
def read_odometer(self):
"""打印一条指出汽车行驶里程的消息"""
print(f"This car has {self.odometer_reading} miles on it.")
def update_odometer(self, mileage): #2.通过方法修改属性的值##
"""将里程表读数设置为指定的值"""
self.odometer_reading = mileage
def increment_odometer(self, miles):#3.通过方法让属性的值递增##
"""让里程表读数增加指定的量"""
self.odometer_reading += miles
my_new_car = Car('audi', 'a4', 2024)
print(my_new_car.get_descriptive_name())
my_new_car.update_odometer(23) #在类外调用方法来改属性的值
my_new_car.read_odometer()
###给属性指定默认值###
#在__init__方法中给默认值
###修改属性的值###
#可以用三种不同的方式修改属性的值:直接通过实例修改,通过方法设置,以及通过方法递增(增加特定的值)。下面依次介绍这些方式。
##1.直接修改属性的值##
my_new_car.odometer_reading = 23
##2.通过方法修改属性的值##
#在类中写update_odometer(self, mileage):方法
#在类外调用方法来改属性的值
##3.通过方法让属性的值递增##
my_used_car = Car('subaru', 'outback', 2019)
print(my_used_car.get_descriptive_name())
my_used_car.update_odometer(23_500)
my_used_car.read_odometer()
my_used_car.increment_odometer(100)
my_used_car.read_odometer()
继承
如果要编写的类是一个既有的类的特殊版本,可使用继承(inheritance)。原有的类称为父类(parent class),而新类称为子类(child class)。子类不仅继承了父类的所有属性和方法,还可定义自己的属性和方法。
📢:父类必须包含在当前文件中,且位于子类前面。
📢:super()
一个特殊的函数,让你能够调用父类的方法。父类也称为超类(superclass),函数名super由此得名。
📢:给子类定义属性和方法
📢:重写父类中的方法
重写办法:在子类中定义一个与要重写的父类方法同名的方法。这样,Python将忽略这个父类方法,只关注你在子类中定义的相应方法。
具体使用在下面代码中体现:
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 = f"{self.year} {self.make} {self.model}"
return long_name.title()
def read_odometer(self):
"""打印一个句子,指出汽车的行驶里程"""
print(f"This car has {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)
#super()是一个特殊的函数,让你能够调用父类的方法。
#这行代码让Python调用Car类的__init__()方法,从而让ElectricCar实例包含这个方法定义的所有属性。
#父类也称为超类(superclass),函数名super由此得名。
self.battery_size = 40
##给子类定义属性↑和方法↓##
def describe_battery(self):
"""打印一条描述电池容量的消息"""
print(f"This car has a {self.battery_size}-kWh battery.")
my_leaf = ElectricCar('nissan', 'leaf', 2024)
print(my_leaf.get_descriptive_name())
my_leaf.describe_battery()
类的编程风格
编程规范需要注意以下几点:
- 类名应采用驼峰命名法,即将类名中的每个单词的首字母都大写,并且不使用下划线
- 实例名和模块名都采用全小写格式,并在单词之间加上下划线。
- 对于每个类,都应在类定义后面紧跟一个文档字符串。这种文档字符串简要地描述类的功能,你应该遵循编写函数的文档字符串时采用的格式约定。每个模块也都应包含一个文档字符串,对其中的类可用来做什么进行描述。
- 在类中,可以使用一个空行来分隔方法;而在模块中,可以使用两个空行来分隔类。
- 先编写导入标准库模块的import语句,再添加一个空行,然后编写导入你自己编写的模块的import语句。