提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
目录
前言
面向对象编程是最有效的软件编写方法之一,在面向对象编程中,你可以根据类来创建对象这叫做实例化,你将指定可在实例中存储什么信息,定义可对这些实例执行哪些操作,你还将编写一些类来扩展既有类的功能,让相似的类能够高效的共享代码
1、创建和使用类
使用类可以模拟任何东西,下面我们可以写一个小狗的简单类Dog----它表示的不是特定的小狗,而是任何小狗,对于大多数宠物狗我们知道它们都有年龄和名字,我们还知道大多数小狗还会蹲下和打滚,我们的Dog类将会包含他们,这个类让python知道如何创建一个小狗的对象
1.1创建Dog类
#创建dog类,它们都有名字,年龄,蹲下,打滚
class Dog():#类中的函数称为方法
"""一次模拟小狗的简单尝试"""
def __init__(self,name,age):
"""初始化属性name和age"""
self.name=name
self.age=age
def sit(self):
"""模拟小狗蹲下"""
print(self.name.title()+" is now sitting.")
def roll_over(self):
"""模拟小狗被命令时打滚"""
print(self.name.title()+" rolled over!")
my_dog = Dog('willie',6)
方法_init_,我们在前面学到的函数一切都适用于方法,就目前而言,唯一重要的差别是调用方法的方式,_init_是个特殊的方法,pyhton会自动运行它,在这个方法中,创建Dog实例时,将自动传入实参self,每个与类相关联的方法都自动传递给实参self
创建的两个self变量可供类中所有方法使用,我们还可以通过任何类的实例来访问这些变量。
1.2根据类创建实例
可将类视为有关如何创建的说明,Dog类是一系列说明,让Python知道如何创建表示特定小狗的实例
my_dog = Dog('willie',6)
print("My dog's name is "+ my_dog.name.title()+".")
print("My dog is "+str(my_dog.age)+" year old.")
命名约定很有用:我们通常可以认为首字母大写的名称(如Dog)指的是类,而小写的名称(如my_dog)指的是根据类创建的实例
1.2.1 访问属性
要访问实例的属性,可使用句点表示法
my_dog.name
句点表示法在python中很常用,这种语法演示python如何获悉属性的值,这里是先找到实例my_dog,再查找与这个实例先关联的属性name,在Dog类中引用这个属性时,使用的是self.name
1.2.2 调用方法
根据Dog 类创建实例后,就可以使用居带内表示法访问Dog类中的定义的任何方法
my_dog.sit()
my_dog.roll_over()
这种语法很有用,如果给属性和方法指定了合适的描述性名称,如name,age,sit()和roll_over,即使是从没有见过的代码块,我们也能知道是干什么的
1.2.3 创建多个实例
my_dog.roll_over()
my_dog = Dog('willie',6)
your_dog =Dog('lucy',3)
print("My dog's name is "+ my_dog.name.title()+".")
print("My dog is "+str(my_dog.age)+" year old.")
my_dog.sit()
print("Your dog's name is "+ your_dog.name.title()+".")
print("Your dog is "+str(your_dog.age)+" year old.")
2.使用类和实例
你可以使用类来模拟现实世界中的很多情景。类编写后你的发不分时间都会花费在使用根据类创建的实例上,你需要执行的一个重要任务就是修改实例的属性,你可以直接修改实例的属性,也可以编写方法以特定的方式修改
2.1 Car类
下面编写一个表示汽车的类,它存储了有关汽车的信息,还有一个汇总这些信息的方法:
class Car():
"""一次模拟汽车的简单尝试"""
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0#里程表为0
def get_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.getdescripitive_name())
方法_init_接受这些形参的值,并将它们存储在根据这个类创建的实例中去
接下来我们可以给它添加一个随时间变化的属性,它能存储汽车的总里程
2.2 给属性指定默认值
在其中加入名字为odometer_reading的属性,其初始值总是为0,我们还添加了一个read_odometer()的方法,用于读取汽车的里程表
def __init__(self,make,model,year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0#里程表为0
但是在现实中里程为0的车并不多,我们需要一个修改属性的值的途径
2.3 修改属性的值
可以有三种不同的方式修改属性的值:1.直接通过实例进行修改2.通过方法进行设置3.通过方法进行递增
#直接对属性进行修改
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
#通过方法修改属性的值
def update_odometer(self,mileage):
if mileage>=self.odometer_reading:
self.odometer_reading =mileage
else:
print("You can not roll back an odometer")
#通过递增来修改属性值
def increment odometer(self,mileage):
self.odometer_reading+=miles
3 继承
编写类的时候并不是总要从头开始。当一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新的类称为子类,子类继承了父类的所有属性和方法,同时还可以定义自己的属性和方法
3.1 子类的方法 _init_
创建子类的实例时,python首先要给父类的所有属性赋值,为此子类的方法,_init_()需要父类施以援手例如下面的模拟电动汽车,电动汽车是一种特殊的汽车,因此我们可以在前面类Car的基础上创建ElectricCar,这样我们只需为电动汽车特有的属性和行为编写代码
下面创建一个ElectricCar类的版本,它具备Car类所有功能
#想要继承必须父类在当前文件中
class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self,make,model,year):
"""初始化父类的属性"""
super().__init__(make,model,year)
super()是一个特殊函数,帮助python将父类和子类关联起来。这行代码让python调用ElectricCar的父类的方法_init_,让EllectricCar实例包含父类的所有属性。因此父类也成为超类(superclass),名称super因此而得名。
3.2 给子类定义属性和方法
让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法。下面来添加一个电车所具备的属性(电池),以及一个描述属性的方法。我们将存储电池容量,病变西一个打印电池描述的方法
#想要继承必须父类在当前文件中
class ElectricCar(Car):
"""电动汽车的独特之处"""
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")
我们添加了新属性self.battery_size,所有的电车类都包含它,但是所有的car类都不包含它,是电车特有的属性。
3.3 重写父类的方法
对于父类的方法,只要它不符合子类模拟实物的行为,都可以对其进行重写,因此可在子类中定义这样一个方法,即它要与重写的父类方法同名。这样python就不会考虑父类这个方法,而只关注你在子类的这个方法
比如Car类有一个名为fill_gas_tank()的方法,它对全电动汽车来说毫无意义,因此你可能想重写它
def ElectricCar(Car):
def fill_gas_tank():
"""电动汽车没有油箱"""
print("This car do not need a gas tank")
这样python在运行的时候就会忽略从父类里继承的方法
4.导入类
比如我们上述写的Car类,我们把Car类写在一个文件中car.py,在使用该类的程序都需要引入模块
from car import Car
import语句让Python打开模块car,并导入其中的Car类,就像它是在这个文件中定义一样。
也可以在一个模块中存储多个类,例如上述写的Car,ElecticCar类都可以添加到Car.py模块中
从一个模块中导入多个类,用逗号分隔各个类。导入必要的类后,就可以根据需要创建每个类的任意数量的实例
也可以导入整个模块,我们可以导入整个模块,在使用句点表示法访问需要的类。这种导入方法很简单,代码也很容易阅读。
import car
my_beetle = car.Car('volkswagen','beetle',2016)
总结
在本章中我们学习了如何编写类;如何使用属性在类中存储信息,以及如何编写方法,已让类具备所需的行为,如何编写方法_init_(),一边根据类创建包含所需属性的实例,学习了如何修改实例的属性,使用继承可简化相关类的创建工作:将一个类的实例用作另一个类的属性可以让类更简洁