Python---类 第九章

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

面向对象编程是最有效的软件编写方法之一,在面向对象编程中,你可以根据类来创建对象这叫做实例化,你将指定可在实例中存储什么信息,定义可对这些实例执行哪些操作,你还将编写一些类来扩展既有类的功能,让相似的类能够高效的共享代码


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_(),一边根据类创建包含所需属性的实例,学习了如何修改实例的属性,使用继承可简化相关类的创建工作:将一个类的实例用作另一个类的属性可以让类更简洁


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值