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语句