Python编程笔记9类

Python编程学习笔记,第9记:类

         本章节,将学习:什么是对象;如何编写类;如何使用属性在类中存储信息;如何编写方法,让类具备所需的行为;如何编写__init__(),以便根据类创建包含所需属性的实例;如何修改实例的属性(包括直接修改以及通过方法进行修改);类的继承;将类存储在模块中……

目录

Python编程学习笔记,第9记:类

# 1.什么是对象

# 2.创建和使用类

# 2.1创建一个Dog类

# 2.2根据类创建实例

# 2.2.1访问属性

# 2.2.2调用方法

# 2.2.3创建多个实例

# 3使用类和实例

# 3.1Car类

# 3.2给属性指定默认值

# 3.3修改属性的值

# (a)直接修改属性的值

# (b)通过方法修改属性的值

# (c)通过方法对属性的值进行递增

# 4继承

# 4.1子类的方法__init()__

# 4.2给子类定义属性方法

# 4.3重写父类的方法

# 4.4将实例用作属性

# 4.5模拟实物

# 5导入类

# 5.1导入单个类

# 5.2在一个模块中存储多个类

# 5.3从一个模块中导入多个类

# 5.4导入整个模块

# 5.5导入模块中所有的类

# 5.6在一个模块中导入另外一个模块

# 5.7自定义工作流程

# 6.Python标准库

# 7类编码风格

才气就是长期的坚持不懈。


# 1.什么是对象

  • # Python里的所有数据都是以对象形式存在的,无论是简单的数字类型还是复杂的代码模块.
  •  
  • # 对象既包含数据(变量,更习惯称之为特性attribute),也包含代码(函数,也称为方法).
  • # 它是某一类具体事物的特殊实例. 例如:整数7是一个对象,整数8是另外一个对象,他们都属于一个公共的类,即整数类.
  • # 当你想要创建一个别人从来就没有创建过的新对象时,首先就必须定义一个类,用以指明该类型的对象所包含的内容(特性和方法).

# 2.创建和使用类

  • # 如果想要在Python中创建属于自己的对象,首先必须用关键字class来定义一个类.
  •  

# 2.1创建一个Dog类

# 2.创建和使用类
# 如果想要在Python中创建属于自己的对象,首先必须用关键字class来定义一个类.
# 2.1创建一个Dog类
# 文件名:dog.py
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.")


  • 类中的函数称为方法.
  • 类中的函数称为方法.
  • # __init__()是一个特殊的方法,每当你根据Dog类创建新实例时,Python就会自动运行它.
  • # 在这个方法的定义中,形参self必不可少,还必须位于其他形参的前面.
  • # Python调用这个__init__()方法来创建Dog实例时,将自动传入实参self.
  • # 每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法.

# 2.2根据类创建实例

# 2.2根据类创建实例
# 根据Dog类创建实例
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's name is Willie.
My  dog is 6 years old.

# 2.2.1访问属性

  • # 要访问实例的属性,可使用句点表示法. 例如:访问my_dog的属性name的值:my_dog.name
  •  

# 2.2.2调用方法

  • # 根据Dog类创建实例后,就可以使用句点法来调用Dog类中定义的任何方法.
  •  
# 2.2.2调用方法
# 根据Dog类创建实例后,就可以使用句点法来调用Dog类中定义的任何方法.
my_dog = Dog('willie', 6)
my_dog.sit()
my_dog.roll_over()

输出结果为:

Willie is now sitting.
Willie rolled over.

# 2.2.3创建多个实例

  • # 可按需求根据类创建任意数量的实例.
  •  
# 2.2.3创建多个实例
# 可按需求根据类创建任意数量的实例.
# 根据Dog类创建多个实例
my_dog = Dog('lucy', 6)
your_dog = Dog('wang_cai', 3)

print("My dog's name is " + my_dog.name.title() + ". ")
print("My dog is " + str(my_dog.age) + " years old. ")
my_dog.sit()

print("\nYour dog's name is " + your_dog.name.title() + ". ")
print("Your dog is " + str(your_dog.age) + " years old. ")
your_dog.roll_over()

输出结果为:

My dog's name is Lucy.
My dog is 6 years old.
Lucy is now sitting.

Your dog's name is Wang_Cai.
Your dog is 3 years old.
Wang_Cai rolled over.

# 3使用类和实例

  • # 类编写好后,大部分时间都将花在使用根据类创建的实例上.
  • # 一个重要的任务就是修改实例的属性.可以直接修改实例的属性,也可以编写方法以特定的方式修改实例的属性.

# 3.1Car类

  • # 编写一个Car类,它存储了有关汽车的信息,还有一个汇总这些信息的方法. 下面通过这个类来学习类的一些使用方法.
  •  
  • # 文件名:car.py
# 3.1Car类
# 编写一个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', 2019)
print(my_new_car.get_descriptive_name())

输出结果为:

2019 Audi A4

# 3.2给属性指定默认值

  • # 类中的每个属性都必须有初始值,哪怕这个值是0或者空字符串.

# 在有些情况下,如设置默认值时,在方法__init__()内指定这种初始值是可行的;如果你对某个属性这样做了,就无需包含为它提供初始值的形参了.

# 3.2给属性指定默认值
# 类中的每个属性都必须有初始值,哪怕这个值是0或者空字符串.
# 在有些情况下,如设置默认值时,在方法__init__()内指定这种初始值是可行的;如果你对某个属性这样做了,就无需包含为它提供初始值的形参了.
# 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_new_car = Car('audi', 'a4', 2019)
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()


输出结果为:

2019 Audi A4
This car has 0 miles on it.

# 3.3修改属性的值

# 可以三种不同的方式修改属性的值:直接通过实例进行修改;通过方法进行设置;通过方法进行递增(增加特定的值).

# (a)直接修改属性的值

  • # 要修改属性的值,最简单的方式是通过实例直接访问它.
  •  
# 3.3修改属性的值
# 可以三种不同的方式修改属性的值:直接通过实例进行修改;通过方法进行设置;通过方法进行递增(增加特定的值).
# (a)直接修改属性的值
# 要修改属性的值,最简单的方式是通过实例直接访问它.
# 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_new_car = Car('audi', 'a4', 2019)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 30
my_new_car.read_odometer()

输出结果为:

2019 Audi A4
This car has 30 miles on it.

# (b)通过方法修改属性的值

  • # 如果有替你更新属性的方法,将大有裨益.这样,你就无需直接访问属性,而可以将值传递给一个方法,由它在内部进行更新.
  •  
# (b)通过方法修改属性的值
# 如果有替你更新属性的方法,将大有裨益.这样,你就无需直接访问属性,而可以将值传递给一个方法,由它在内部进行更新.
# 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.")

    def update_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', 2019)
print(my_new_car.get_descriptive_name())
my_new_car.update_odometer(36) 
my_new_car.read_odometer()

输出结果为:

2019 Audi A4
This car has 36 miles on it.

# (c)通过方法对属性的值进行递增

  • # 有时候需要将属性值递增特定的两,而不是将其设置为全新的值.
  •  
# (c)通过方法对属性的值进行递增
# 有时候需要将属性值递增特定的两,而不是将其设置为全新的值.
# 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.")

    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):
        """将里程表读数增加指定的量"""
        if int(miles) < 0:
            print("It can't be less than 0.")
        else:
            self.odometer_reading += miles


my_used_car = Car('subaru', 'outback', 2020)
print(my_used_car.get_descriptive_name())

my_used_car.update_odometer(3600)
my_used_car.read_odometer()

my_used_car.increment_odometer(100)
my_used_car.read_odometer()

输出结果为:

2020 Subaru Outback
This car has 3600 miles on it.
This car has 3700 miles on it.
It can't be less than 0.
This car has 3700 miles on it.

# 4继承

  • # 如果你要编写的类是另外一个现成类的特殊版本,可使用继承.
  • # 一个类继承另外一个类时,它将自动获得另外一个类的所有属性和方法;原有的类称为父类,而继承的新类称为子类.
  • # 子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法.

# 4.1子类的方法__init()__

  • # 创建子类的实例时,Python首先要完成的任务是给父类的所有属性赋值.为此,子类的方法__init()__需要父类施以援手.

# 在上一个Car类的基础上创建一个新类ElectricCar,来讲解与类的继承相关的知识点.

# 4.1子类的方法__init()__
# 创建子类的实例时,Python首先要完成的任务是给父类的所有属性赋值.为此,子类的方法__init()__需要父类施以援手.
# 在上一个Car类的基础上创建一个新类ElectricCar,来讲解与类的继承相关的知识点.
# 文件名: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()

    def read_odometer(self):
        """打印出一条指出汽车里程的消息"""
        print("This car has " + str(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):
        """将里程表读数增加指定的量"""
        if int(miles) < 0:
            print("It can't be less than 0.")
        else:
            self.odometer_reading += miles


class ElectricCar(Car):  # 继承,根据现有的类创建一个新类.
    """电动汽车的独特之处"""

    def __init__(self, make, model, year):
        """初始化父类的属性"""
        super().__init__(make, model, year)  # 函数super(),将父类与子类关联起来.让Python调用其父类的方法__init__().


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

输出结果为:

2016 Tesla Model S

  • # 创建子类时,父类必须包含在当前文件中,且位于子类前面.
  • # 定义子类时,必须在括号内指定父类的名称.
  • # super函数是一个特殊的函数,帮助Python将父类与子类关联起来.

# 4.2给子类定义属性方法

# 让一个类继承另外一个类后,可添加区分子类与父类所需的新属性和方法.

# 4.2给子类定义属性方法
# 让一个类继承另外一个类后,可添加区分子类与父类所需的新属性和方法.
# 文件名:electric_car.py
class Car():
    """一次模拟汽车的简单尝试"""

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

    def get_descriptive_name(self):
        """返回简洁的描述性信息"""
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()

    def fill_gas_tank(self):
        """打印出一条油箱容量的简洁信息"""
        print("The fuel tank capacity of the car is " + str(self.tank_capacity) + "L.")

    def read_odometer(self):
        """打印出一条指出汽车里程的消息"""
        print("This car has " + str(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):
        """将里程表读数增加指定的量"""
        if int(miles) < 0:
            print("It can't be less than 0.")
        else:
            self.odometer_reading += miles


class ElectricCar(Car):  # 继承,根据现有的类创建一个新类.
    """电动汽车的独特之处"""

    def __init__(self, make, model, year):
        """
        初始化父类的属性
        再初始化电动汽车特有的属性
        """
        super().__init__(make, model, year)  # 函数super(),将父类与子类关联起来.让Python调用其父类的方法__init__().
        self.battery_size = 70

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


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

输出结果为:

2016 Tesla Model S
This car has a 70-kwh battery.
The fuel tank capacity of the car is 35L.

# 4.3重写父类的方法

  • # 对于父类的方法,只要它不符合子类模拟的实物,都可以对其进行重写.
  • # 为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名.
  • # 这样Python将不会考虑这个父类方法,而只关注你在子类中定义的相应方法.

# 纯电动汽车是没有油箱的,因此需要对上面的父类方法fill_gas_tank()进行重写.

# 4.3重写父类的方法
# 对于父类的方法,只要它不符合子类模拟的实物,都可以对其进行重写.
# 为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名.
# 这样Python将不会考虑这个父类方法,而只关注你在子类中定义的相应方法.
# 文件名:electric_car.py
class Car():
    """一次模拟汽车的简单尝试"""

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

    def get_descriptive_name(self):
        """返回简洁的描述性信息"""
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()

    def fill_gas_tank(self):
        """打印出一条油箱容量的简洁信息"""
        print("The fuel tank capacity of the car is " + str(self.tank_capacity) + "L.")

    def read_odometer(self):
        """打印出一条指出汽车里程的消息"""
        print("This car has " + str(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):
        """将里程表读数增加指定的量"""
        if int(miles) < 0:
            print("It can't be less than 0.")
        else:
            self.odometer_reading += miles


class ElectricCar(Car):  # 继承,根据现有的类创建一个新类.
    """电动汽车的独特之处"""

    def __init__(self, make, model, year):
        """
        初始化父类的属性
        再初始化电动汽车特有的属性
        """
        super().__init__(make, model, year)  # 函数super(),将父类与子类关联起来.让Python调用其父类的方法__init__().
        self.battery_size = 70

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

    def fill_gas_tank(self):  # 重写父类方法
        """
        打印出一条油箱容量的简洁信息
        纯电动汽车没有油箱
        """
        print("ElectricCar does't need a gas tank.")


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

输出结果为:

2016 Tesla Model S
This car has a 70-kwh battery.
ElectricCar does't need a gas tank.

  • # 使用继承时,可以让子类保留从父类那里继承而来的精华,并剔除不需要的糟粕.

# 4.4将实例用作属性

  • # 使用代码模拟实物时,你可能会发现自己各类添加的细节越来越多:属性和方法清单以及文件都越来越长.
  • # 在这种情况下,可能需要将类的一部分作为一个独立的类提取出来.
  • # 你可以将大型类拆分成多个协同工作的小类.
  •  
# 4.4将实例用作属性
# 使用代码模拟实物时,你可能会发现自己各类添加的细节越来越多:属性和方法清单以及文件都越来越长.
# 在这种情况下,可能需要将类的一部分作为一个独立的类提取出来.
# 你可以将大型类拆分成多个协同工作的小类.
# 文件名:electric_car.py
class Car():
    """一次模拟汽车的简单尝试"""

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

    def get_descriptive_name(self):
        """返回简洁的描述性信息"""
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()

    def fill_gas_tank(self):
        """打印出一条油箱容量的简洁信息"""
        print("The fuel tank capacity of the car is " + str(self.tank_capacity) + "L.")

    def read_odometer(self):
        """打印出一条指出汽车里程的消息"""
        print("This car has " + str(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):
        """将里程表读数增加指定的量"""
        if int(miles) < 0:
            print("It can't be less than 0.")
        else:
            self.odometer_reading += miles


class Battery():  # Battery新类
    """一次模拟电动汽车电瓶的简单尝试"""

    def __init__(self, battery_size=100):
        """初始化电瓶的属性"""
        self.battery_size = battery_size

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

    def get_range(self):
        """打印一条消息,指出电瓶的续航里程"""
        if self.battery_size == 80:
            range = 240
        elif self.battery_size == 100:
            range = 270

        message = "This car can go approximately " + str(range)
        message += " miles on a full charge."
        print(message)


class ElectricCar(Car):  # 继承,根据现有的类创建一个新类.
    """电动汽车的独特之处"""

    def __init__(self, make, model, year):
        """
        初始化父类的属性
        再初始化电动汽车特有的属性
        """
        super().__init__(make, model, year)  # 函数super(),将父类与子类关联起来.让Python调用其父类的方法__init__().
        self.battery = Battery()


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

输出结果为:

2018 Tesla Model S
This car has a 100-kwh battery.
This car can go approximately 270 miles on a full charge.

# 4.5模拟实物

  • # 从较高的逻辑层面(而不是语法层面)考虑;你考虑的不是Python,而是如何使用代码来表示实物.
    # 到达这种境界后,你经常会发现,现实世界的建模方法并没有对错之分.
  • # 有些方法的效率更高,但要找出效率最高的表示法,需要经过一定的实践.
    # 只要代码像你希望的那样运行,就说明你做得很好!
  • # 即便你发现自己不得不多次尝试使用不同的方法来重写类,也不必气馁;
    # 要编写出高效、准确的代码,都得经过这样的过程.

# 5导入类

# Python允许将类存储在模块中,然后在主程序中导入所需的模块.

# 5.1导入单个类

# 将上面的Car类拆分出来,存储在一个名为car9_1.py的文件中.
"""一个用于表示汽车的类"""
# 应为自己创建的每个模块都编写文档字符串,对模块的内容做简要的描述.


# 文件名:car9_1.py
class Car():
    """一次模拟汽车的简单尝试"""

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

    def get_descriptive_name(self):
        """返回简洁的描述性信息"""
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()

    def fill_gas_tank(self):
        """打印出一条油箱容量的简洁信息"""
        print("The fuel tank capacity of the car is " + str(self.tank_capacity) + "L.")

    def read_odometer(self):
        """打印出一条指出汽车里程的消息"""
        print("This car has " + str(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):
        """将里程表读数增加指定的量"""
        if int(miles) < 0:
            print("It can't be less than 0.")
        else:
            self.odometer_reading += miles

# 再创建另一个文件名为my_car9_1.py的文件,在其中导入Car类并创建其实例.
# 文件名:my_car9_1.py

# 5.1导入单个类
# 将上面的Car类拆分出来,存储在一个名为car9_1.py的文件中.
# 再创建另一个文件名为my_car9_1.py的文件,在其中导入Car类并创建其实例.
from car9_1 import Car  # 导入类模块

my_new_car = Car('audi', 'Q5', '2019')
print(my_new_car.get_descriptive_name())

my_new_car.odometer_reading = 23
my_new_car.read_odometer()

输出结果为:

2019 Audi Q5
This car has 23 miles on it.

# 注意:文件car9_1.py和my_car9_1.py需在同一目录下.

# 5.2在一个模块中存储多个类

  • # 可根据需要在一个模块中存储任意数量的类.
"""一个用于表示汽车的类"""
# 应为自己创建的每个模块都编写文档字符串,对模块的内容做简要的描述.


# 文件名:car9_1.py
class Car():  # Car类
    """一次模拟汽车的简单尝试"""

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

    def get_descriptive_name(self):
        """返回简洁的描述性信息"""
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()

    def fill_gas_tank(self):
        """打印出一条油箱容量的简洁信息"""
        print("The fuel tank capacity of the car is " + str(self.tank_capacity) + "L.")

    def read_odometer(self):
        """打印出一条指出汽车里程的消息"""
        print("This car has " + str(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):
        """将里程表读数增加指定的量"""
        if int(miles) < 0:
            print("It can't be less than 0.")
        else:
            self.odometer_reading += miles


class Battery():  # Battery新类
    """一次模拟电动汽车电瓶的简单尝试"""

    def __init__(self, battery_size=100):
        """初始化电瓶的属性"""
        self.battery_size = battery_size

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

    def get_range(self):
        """打印一条消息,指出电瓶的续航里程"""
        if self.battery_size == 80:
            range = 240
        elif self.battery_size == 100:
            range = 270

        message = "This car can go approximately " + str(range)
        message += " miles on a full charge."
        print(message)


class ElectricCar(Car):  # 继承,根据现有的类创建一个新类ElectricCar.
    """电动汽车的独特之处"""

    def __init__(self, make, model, year):
        """
        初始化父类的属性
        再初始化电动汽车特有的属性
        """
        super().__init__(make, model, year)  # 函数super(),将父类与子类关联起来.让Python调用其父类的方法__init__().
        self.battery = Battery()


  •  

# 5.3从一个模块中导入多个类

  • # 可根据需要在程序文件中导入任意数量的类.
# 文件名:my_car9_1.py

# ……
# ……

# 5.3从一个模块中导入多个类
# 可根据需要在程序文件中导入任意数量的类.
from car9_1 import Car, ElectricCar

my_beetle = Car('Volkswagen', 'beetle', 2017)
print(my_beetle.get_descriptive_name())

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

输出结果为:

2017 Volkswagen Beetle
2016 Tesla Roadster

# 5.4导入整个模块

  • # 还可以导入整个模块,在使用句点表示法访问需要的类.这种导入方法很简单,代码也易于阅读.
  • # 由于创建类实例的代码都包含模块的名称,因此不会与当前文件使用的任何名称发生冲突.
  •  
# 文件名:my_car9_1.py

# ……
# ……

# 5.4导入整个模块
# 还可以导入整个模块,在使用句点表示法访问需要的类.这种导入方法很简单,代码也易于阅读.
# 由于创建类实例的代码都包含模块的名称,因此不会与当前文件使用的任何名称发生冲突.
# 下面导入整个car9_1模块
import car9_1

my_beetle = car9_1.Car('Volkswagen', 'beetle', 2020)
print(my_beetle.get_descriptive_name())

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

# 使用语法 module_name.class_name访问需要的类.

输出结果为:

2020 Volkswagen Beetle
2020 Tesla Roadster

  •  
  • # 使用语法 module_name.class_name访问需要的类.
  •  

# 5.5导入模块中所有的类

  • # 要导入模块中所有的类,可使用语法:from module_name import *
  • # 但不推荐使用这种方式.
  • # 需要从一个模块中导入很多类时,最好的方式是导入整个模块,使用 module_name.class_name语法访问需要的类.
# 需要从一个模块中导入很多类时,最好的方式是导入整个模块,使用 module_name.class_name语法访问需要的类.

# 5.6在一个模块中导入另外一个模块

  • # 有时候,需要将雷分散到多个模块中,以免模块太大,或在同一模块中存储不相关的函数.
  • # 将类存储在多个模块中时,你可能会发现一个模块中的类依赖于另外一个模块中的类.
  • # 这时,就要在前一个模块中导入必要的类.
# 新建一个名为car9_2.py的文件,其中只包含一个Car类.
"""一个可表示汽车的类"""
# 只包含一个Car类


# 文件名:car9_2.py
class Car():  # Car类
    """一次模拟汽车的简单尝试"""

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

    def get_descriptive_name(self):
        """返回简洁的描述性信息"""
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()

    def fill_gas_tank(self):
        """打印出一条油箱容量的简洁信息"""
        print("The fuel tank capacity of the car is " + str(self.tank_capacity) + "L.")

    def read_odometer(self):
        """打印出一条指出汽车里程的消息"""
        print("This car has " + str(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):
        """将里程表读数增加指定的量"""
        if int(miles) < 0:
            print("It can't be less than 0.")
        else:
            self.odometer_reading += miles

# 新建一个名为electric_car9_3.py的文件,其中包含Battery类和类ElectricCar.
"""一组可表示电动汽车的类"""
# 新建一个名为electric_car9_3.py的文件,其中包含Battery类和类ElectricCar.

from car9_2 import Car  # 该行代码必不可少,因为ElectricCar类需要访问父类Car.否则将在我们试图创建ElectricCar实例时引发错误.



# 文件名:electric_car9_3.py
class Battery():  # Battery新类
    """一次模拟电动汽车电瓶的简单尝试"""

    def __init__(self, battery_size=100):
        """初始化电瓶的属性"""
        self.battery_size = battery_size

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

    def get_range(self):
        """打印一条消息,指出电瓶的续航里程"""
        if self.battery_size == 80:
            range = 240
        elif self.battery_size == 100:
            range = 270

        message = "This car can go approximately " + str(range)
        message += " miles on a full charge."
        print(message)


class ElectricCar(Car):  # 继承,根据现有的类创建一个新类ElectricCar.
    """电动汽车的独特之处"""

    def __init__(self, make, model, year):
        """
        初始化父类的属性
        再初始化电动汽车特有的属性
        """
        super().__init__(make, model, year)  # 函数super(),将父类与子类关联起来.让Python调用其父类的方法__init__().
        self.battery = Battery()

# 现在可分别从每个模块中导入类,以根据需要创建任何类型的实例.

# 文件名:my_car9_1.py

# ……
# ……

# 5.6在一个模块中导入另外一个模块
# 有时候,需要将雷分散到多个模块中,以免模块太大,或在同一模块中存储不相关的函数.
# 将类存储在多个模块中时,你可能会发现一个模块中的类依赖于另外一个模块中的类.
# 这时,就要在前一个模块中导入必要的类.

# 新建一个名为car9_2.py的文件,其中只包含一个Car类.
# 新建一个名为electric_car9_3.py的文件,其中包含Battery类和类ElectricCar.

# 现在可分别从每个模块中导入类,以根据需要创建任何类型的实例.
from car9_2 import Car
from electric_car9_3 import ElectricCar

my_beetle = Car('Volkswagen', 'beetle', 2021)
print(my_beetle.get_descriptive_name())

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

输出结果为:

2021 Volkswagen Beetle
2021 Tesla Roadster

# 5.7自定义工作流程

  • # 先尽可能在一个文件中完成所有的工作,确定一切都能正确运行后,再将类移到独立的模块中.
  • # 一开始应让代码结构尽可能简单.
  •  
  • # 如果你喜欢模块和文件的交互方式,可在项目开始时就尝试将类存储到模块中.
  • # 先找出让你能够编写出可行代码的方式,再尝试让代码更为组织有序.
  •  

# 6.Python标准库

  • # Python标准库是一组模块,安装的Python都包含它.
    # 下面来看模块collections中的一个类-----OrderedDict
  • # 字典让你能够将信息关联起来,但它们不记录你添加键值对的顺序.
  • # 要创建字典并记录其中的键值对的添加顺序,可使用模块collections中的OrderedDict类.
  • # OrderedDict类实例行为几乎与字典相同,区别在于它记录了键值对的添加顺序.
  •  
  • # 类OrderedDict是一个很不错的类,它兼具列表和字典的优点(在将信息相关联起来的同时保留原来的顺序).
# 6.Python标准库
# Python标准库是一组模块,安装的Python都包含它.
# 下面来看模块collections中的一个类-----OrderedDict

# 字典让你能够将信息关联起来,但它们不记录你添加键值对的顺序.
# 要创建字典并记录其中的键值对的添加顺序,可使用模块collections中的OrderedDict类.
# OrderedDict类实例行为几乎与字典相同,区别在于它记录了键值对的添加顺序.
from collections import OrderedDict

favorite_languages = OrderedDict()  # 调用OrderedDict()来创建一个空字典.

favorite_languages['jen'] = 'python'
favorite_languages['sarah'] = 'c'
favorite_languages['phil'] = 'java'
favorite_languages['selene'] = 'c'

for name, language in favorite_languages.items():
    print(name.title() + "'s favorite language is " +
          language.title() + ".")

# 类OrderedDict是一个很不错的类,它兼具列表和字典的优点(在将信息相关联起来的同时保留原来的顺序).

输出结果为:

Jen's favorite language is Python.
Sarah's favorite language is C.
Phil's favorite language is Java.
Selene's favorite language is C.

# 7类编码风格

  • # 类名应采用驼峰命名法 ,即将类名中的每个单词的首字母都大写,而不使用下划线.
  • # 实例名和模块名都采用小写格式,并在单词之间加上下划线.
  •  
  • # 对于每个类,都应紧跟在类定义后面包含一个文档字符串.
  • # 这种文档字符串简要地描述类的功能,并遵循编写函数的文档字符串时采用的格式约定.
  • # 每个模块也都应包含一个文档字符串,对其中的类可用于做什么进行描述.
  •  
  • # 可使用空行来组织代码,但不要滥用.
  • # 在类中,可使用一个空行来分隔方法;而在模块中,可使用两个空行来分隔类.
  • # 需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的import 语句,
  • # 再添加一个空行,然后编写导入你自己编写的模块的import 语句.
  •  

才气就是长期的坚持不懈。

猜你喜欢

转载自blog.csdn.net/yishuihanq/article/details/106268533
今日推荐