1 创建和使用类
编写类:定义一大类对象都有的通用行为
基于类创建对象:每个对象都自动具备这种通用行为,再根据需要服务每个对象独特个性
实例化:根据类创建对象
1.1 创建Dog类
class Dog:
"""一次模拟小狗的简单尝试"""
def __init__(self,name,age):
"""初始化属性name和age"""
self.name = name
self.age = age
def sit(self):
def roll_over(self):
方法:类中的函数
方法__init__():根据类创建新实例时,python会自动运行它。
以self为前缀的变量可供类中的所有方法使用。
1.2 根据类创建实例
my_dog = Dog('Willie',6)
句点表示法访问属性:my_dog.name
句点表示法调用方法:my_dog.sit()
2 使用类和实例
2.1 Car类
class Car:
"""一次模拟汽车的简单尝试"""
def __init__(self,make,model,year):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year
def get_descriptive_name(self):
"""返回整洁的描述性信息"""
long_name = f"{self.year} {self.make} {self.model}"
return long_name.title()
2.2 给属性指定默认值
class Car:
"""一次模拟汽车的简单尝试"""
def __init__(self,make,model,year):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year
self.odometer = 0
def get_descriptive_name(self):
"""返回整洁的描述性信息"""
long_name = f"{self.year} {self.make} {self.model}"
return long_name.title()
def read_odmeter(self):
print(f"{self.odometer}")
2.3 修改属性的值
方法一:直接修改属性的值
my_car = Car('audi','a4',2019)
my_new_car.odometer_reading = 23
方法二:通过方法修改属性的值
class Car:
--snip--
def update_odometer(self,mileage):
"""将里程表读数设置为指定的值"""
self.odometer_reading = mileage
my_car = Car('audi','a4',2019)
my_car.update_odometer(23)
my_car.read_odometer()
方法三:通过方法对属性的值进行递增
class Car:
--snip--
def update_odometer(self,mileage):
"""将里程表读数设置为指定的值"""
self.odometer_reading = mileage
def increment_odometer(self,miles):
"""将里程表读数增加指定的值"""
self.odometer_reading += miles
my_car = Car('audi','a4',2019)
my_car.update_odometer(23)
my_car.read_odometer()
my_car.increment_odometer(10)
my_car.read_odometer()
3 继承
继承:一个类自动获得另一个类的所有属性和方法
3.1 子类的继承方法__init__()
class Car:
--snip--
class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self,make,model,year):
""""初始化父类的属性"""
super().__init__(make,model,year)
my_tesla = ElectricCar('tesla','model s',2019)
创建子类时,父类必须包含在当前文件中,且位于子类前面。
定义子类时,必须在圆括号内指定父类的名称。
方法__init__():接受创建Car实例所需的信息
函数super():调用父类的方法__init__(),让实例包含这个方法中定义的所有属性。
3.2 给子类定义属性和方法
class Car:
--snip--
class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self,make,model,year):
""""初始化父类的属性,在初始化电动汽车的特有属性"""
super().__init__(make,model,year)
self.battery_size = 75
def describe_battery(self):
print(self.battery_size)
3.3 重写父类的方法
why:对不符合子类模拟实物的行为,都可以重写
how:定义一个与重写父类方法同名的方法,python只会关注你在子类中定义的相应方法。
同名重写:继承精华,剔除糟粕
3.4 将实例用作属性
why:添加细节过多,将类的一部分提取出来,作为独立的类。(大类拆分为小类)
class Car:
--snip--
class Battery:
"""一次模拟电动汽车电瓶的简单尝试"""
def __init__(self,bay=ttery_size=75):
"""初始化电瓶的属性"""
self.battery_size = battery_size
def describe_battery(self):
print(self.battery_size)
class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self,make,model,year):
""""初始化父类的属性,在初始化电动汽车的特有属性"""
super().__init__(make,model,year)
self.battery_size = Battery
my_tesla = ElectricCar('tesla','model s',2019)
my_tesla.battery.describe_battery()
3.5 模拟实物
4 导入类
4.1 导入单个类
将Car类存储在一个名为car.py的模块中
from car import Car # 文件名即为模块名
4.2 在一个模块中存储多个类
from car import ElectricCar
4.3 在一个模块中导入多个类
from car import Car,ElectricCar
4.4 导入整个模块
import car
4.5 导入模块中的所有类
from car import *
4.6 在一个模块中导入另一个模块
将Car类存储在car.py模块中,将ElectricCar类和Battery类存储在electric_car.py模块中。
"""一组可用于表示汽车的类"""
class Car:
--snip--
"""一组可用于表示电动汽车的类"""
form car inport Car
class Battery:
--snip--
class ElectricCar(Car):
--snip--
# 创建任意类型的汽车
from car import Car
from electric_car import ElectricCar
4.7 使用别名
from 模块名 import 类名 as 别名
4.8 自定义工作流程
5 Python标准库
6 类编码风格
类名命名:驼峰命名法
在类中:一个空行分隔方法
在模块中:两个空行分隔类
先编写导入标准库模块的import语句,再添加一个空行后编写导入自定义模块的import语句