一、创建和使用类

1.创建Car类

car.py


class Car():
    """一次模拟汽车的简单尝试"""

    def __init__(self, make, model, year):
        """初始化描述汽车的属性"""
        self.make = make
        self.model = model
        self.year = year

    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.get_descriptive_name())

给属性制定默认值时,可在方法_init_()中制定,且无需包含为它提供初始值的形参。

下面添加一个名为odometer_reading的属性,其初始值为0。

def __init__(self, make, model, year):
        """初始化描述汽车的属性"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0

二、继承

1.声明一个电动汽车ElectricCar类,继承汽车Car类。

创建子类的实例时,Python首先需要完成的任务是给父类的所有属性赋值。为此,子类的方法_init_()需要父类帮忙。

electric_car.py


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 = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()


class ElectricCar(Car):

    def __init__(self, make, model, year):
        super().__init__(make, model, year)


my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())

创建子类时,父类必须包含在当前文件中,且位于子类前面。必须在括号内制定父类的名称,方法_init_()接受创建Car实例所需的信息。

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.")

3.将实例用作属性

把汽车电瓶的属性和方法提取出来,放到一个Battery的类中,并将一个Battery实例用作ElectricCar类的一个属性:

class Car():
    --snip--

class Battery():
    def __init__(self,battery_size=70):
        self.battery_size = battery_size

    def describe_battery(self):
        """打印一条描述电池电量的信息"""
        print("This Car has a " + str(self.battery_size) + "-kWh battery.")


class ElectricCar(Car):

    def __init__(self, make, model, year):
        """
        电动汽车的独到之处
        初始化父类的属性,再初始化电动汽车特有的属性
        """
        super().__init__(make, model, year)
        """把一个Battery的实例作为属性"""
        self.battery = Battery()


my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()

要描述电瓶时,需要使用电动汽车的属性battery:my_tesla.battery.describe_battery()

三、导入类

1.导入单个类

将Car类存储在一个名为car.py的模块中,创建另一个文件——my_car.py,在其中导入Car类并创建其实例:

car.py


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 = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()

    def read_odometer(self):
        print("This car has " + str(self.odometer_reading) + " miles on it.")

my_car.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
print(my_new_car.odometer_reading)
my_new_car.read_odometer()

2.在一个模块中存储多个类

可根据需要在一个模块中存储任意数量的类,类Battery和ElectricCar都可以帮助模拟汽车,因此把他们都加入到car.py。

car.py


class Car():
    --snip--

class Battery():
    def __init__(self,battery_size=70):
        self.battery_size = battery_size

    def describe_battery(self):
        """打印一条描述电池电量的信息"""
        print("This Car has a " + str(self.battery_size) + "-kWh battery.")


class ElectricCar(Car):

    def __init__(self, make, model, year):
        """
        电动汽车的独到之处
        初始化父类的属性,再初始化电动汽车特有的属性
        """
        super().__init__(make, model, year)
        """把一个Battery的实例作为属性"""
        self.battery = Battery()

3.从一个模块中导入多个类

如果要在同一个程序中创建普通汽车和电动汽车,就需要把Car和ElectricCar类都导入:

my_car.py


from car import Car, ElectricCar

my_beetle = Car('volkswagen', 'beetle', 2016)
print(my_beetle.get_descriptive_name())

my_tesla = ElectricCar('tesla', 'roadster', 2016)
print(my_tesla.get_descriptive_name())

4.导入整个模块

如果导入整个模块,再使用句点表示法访问需要的类。

my_car.py


import car

my_beetle = car.Car('volkswagen', 'beetle', 2016)
print(my_beetle.get_descriptive_name())

my_tesla = car.ElectricCar('tesla', 'roadster', 2016)
print(my_tesla.get_descriptive_name())