python基础知识——类

1. 创建类和实例

  • 在python中,首字母大写的名称指的是类
  • 方法__init__()中,self必不可少,还必须位于其他形参前面,此方法的名称中,开头和末尾各有两个下划线
  • 每当根据类创建新实例时,python都会自动运行__init__(),虽然方法__init__()并未显式地包含return语句,但python自动返回一个当前类的实例,存储在变量my_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)
    print("My dag is " + str(my_dog.age) + "Tools")
    my_dog.sit()
    my_dog.roll_over()

    运行结果

    My dag is 6 years old.
    Willie is now sitting.
    Willie rolled over!

2. 使用类和实例

2.1 给属性指定默认值

  • 设置默认值时,可以在方法__init__()中指定属性的初始值,此时无需包含为它提供初始值的形参
  • class Car():
        '''一次模拟汽车的简单尝试'''
    
        def __init__(self, make, model, year):
            '''初始化描述汽车的属性'''
            self.make = make
            self.model = model
            self.year = year
            self.odometer = 0
    
        def read_odometer(self):
            '''打印一条指出汽车里程的消息'''
            print("This car has " + str(self.odometer) + " miles on it.")

2.2 修改属性的值

  • 直接修改属性的值,如my_car.odometer = 23
  • 通过方法修改属性的值,在类的定义中加上如下函数
    • def update_odometer(self, mileage):
              '''将里程表读数设置为指定的值'''
              self.odometer = mileage

      调用时

      my_car.update_odometer(23)
      my_car.read_odometer()
  • 通过方法对属性的值进行递增,在类的定义中加上如下函数
    • def increment_odometer(self, miles):
              '''将里程表读数增加指定的量'''
              self.odometer += miles

      调用时

      my_car.increment_odometer(200)
      my_car.read_odometer()

3. 继承

  • 一个类继承另一个类时,它将自动获得另一个类的所有属性和方法
  • 原有的类称为父类,新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法
  •  1 class Car():
     2     '''汽车'''
     3 
     4     def __init__(self, make, model, year):
     5         '''初始化描述汽车的属性'''
     6         self.make = make
     7         self.model = model
     8         self.year = year
     9         self.odometer = 0
    10 
    11     def read_odometer(self):
    12         '''打印一条指出汽车里程的消息'''
    13         print("This car has " + str(self.odometer) + " miles on it.")
    14 
    15     def get_name(self):
    16         long_name = str(self.year) + ' ' + self.make + ' ' + self.model
    17         return long_name.title()
    18 
    19 class ElectricCar(Car):
    20     '''电动汽车'''
    21 
    22     def __init__(self, make, model, year):
    23         '''初始化父类的属性'''
    24         super().__init__(make, model, year)
    25 
    26 my_car = ElectricCar('tesla', 'model s', 2016)
    27 print(my_car.get_name())

    运行结果

    2016 Tesla Model S
    • 创建子类时,父类必须包含在当前文件中,且位于子类前面
    • 定义子类时,必须在括号内指定父类的名称
    • 第24行中的super()是一个特殊函数,帮助python将父类和子类关联起来,这行代码让python调用父类的方法__init__()
  • 对于父类的方法,子类都可对其进行重写,为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名
  • 将实例用作属性
  •  
     1 class Battery():
     2     '''电动汽车的电瓶'''
     3 
     4     def __init__(self, battery = 70):
     5         '''初始化电瓶的属性'''
     6         self.battery = battery
     7 
     8     def describe_battery(self):
     9         '''打印一条描述电瓶容量的消息'''
    10         print("This car has a " + str(self.battery) + "-KWh battery.")
    11 
    12 class ElectricCar(Car):
    13     '''电动汽车'''
    14 
    15     def __init__(self, make, model, year):
    16         '''初始化父类的属性'''
    17         super().__init__(make, model, year)
    18         self.battery = Battery()
    19 
    20 my_car = ElectricCar('tesla', 'model s', 2016)
    21 print(my_car.get_name())
    22 
    23 my_car.battery.describe_battery()

    运行结果

    This car has a 70-KWh battery.
    • 在ElectricCar类前定义了一个名为Battery的新类
    • 在ElectricCar类中,添加了一个名为self.battery的属性,这行代码让python创建一个新的Battery实例,并将该实例存储在属性self.battery中
    • 现在每个ElectricCar实例都包含一个自动创建的Battery实例
    • 第23行调用了Battery方法

4. 导入类

  • 为使文件尽可能简洁,可以将类存储在模块中,然后在主程序中导入所需的模块

4.1 导入单个类

  • 通用语法为:from 模块文件名 import 类名
  • 在使用类时可直接像前面那样使用
  • 可以根据需要在一个模块中存储任意数量的类

4.2 从一个模块中导入多个类

  • 可以根据需要在程序文件中导入任意数量的类
  • 导入多个类时,使用逗号分隔各类

4.3 导入整个模块

  • import car
    
    my_beetle = car.Car('volkswagen', 'beetle', 2016)
    my_tesla = car.ElectricCar('tesla', 'roadster', 2016)

     

4.4 导入模块中的所有类

  • 通用语法为:from module_name import *
  • 但不推荐使用此种方法,若需要从一个模块中导入很多类时,最好导入整个模块

5. python标准库

  • python标准库是一组模块
  • 比如模块collections中的一个类——OrderedDict,它可以创建字典并记录其中的键值对添加顺序。OrderedDict实例的行为几乎与字典相同,区别只在于记录了键值对的添加顺序
  • from collections import OrderedDict
    
    languages = OrderedDict()
    
    languages['jen'] = 'python'
    languages['sarah'] = 'c'
    languages['edward'] = 'ruby'
    
    for name, language in languages.items():
        print(name.title() + "'s favorite language is " + language.title() + ".")

    运行结果

    Jen's favorite language is Python.
    Sarah's favorite language is C.
    Edward's favorite language is Ruby.

6. 类编码风格

  • 类名应采用驼峰命名法:类名中的每个单词首字母都大写,不使用下划线
  • 实例名和模块名都采用小写格式,并在单词之间加下划线
  • 在类中,可使用一个空行来分隔方法;在模块中,可使用两个空行来分隔类
  • 需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的import语句,再添加一个空行,然后编写导入你自己编写的模块的import语句
posted @ 2021-07-21 22:33  bky-16  阅读(147)  评论(0编辑  收藏  举报