面向对象:类的使用
基本概念:
- 类:模拟现实世界的事物和场景
- 属性:参数;行为:函数
- 实例化:根据类创建对象
Dog 类(创建使用类):
- 创建Dog类:初始化方法+行为函数
class Dog():
"""小狗类编写"""
def __init__(self, name, age): #初始化方法
self.name = name #初始化属性name
self.age = age #初始化属性age
def sit(self): #函数sit(),小狗的行为,让小狗蹲下
print(self.name.title() + "已经蹲下")
def roll(self): #函数roll(),小狗的行为,让小狗打滚
print(self.name.title() + "正在打滚")
1. 约定python中首字母大写的名称是类
2. 初始化方法__init__(),必须要有self,它是指向实例的引用,访问类的属性和方法
- 创建使用类的实例:小写名称为实例
初始化方法init()并未显示包含return语句,在用实参创建对象实例时,自动返回相应实例
my_dog = Dog("black", 6) #实例化一个小狗对象my_dog,名为black,年龄为6
print("小狗%s今年%d岁了" %(my_dog.name, my_dog.age)) #通过对象调用属性
my_dog.sit() #通过对象调用方法
#print(my_dog.roll()) 如果print打印的函数没有返回值,则输出None
输出:
小狗black今年6岁了
Black已经蹲下
Car类(使用并修改更新类):
类的创建与对象调用:
属性在类中直接使用,在类外通过对象调用
class Car():
"""模拟汽车"""
#初始化对象属性:车场,型号,生产时间
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.li_cheng = 0 #可以在初始化方法中设置属性默认值,无需定义形参
# 返回汽车信息
def car_information(self):
long_name = ("%s,%s,%d" %(self.make, self.model, self.year)) #类内直接使用属性
return long_name
#输出汽车行驶里程
def car_licheng(self):
print("汽车已经行驶%d公里" %self.li_cheng) #类内部直接使用属性
my_car = Car("BMW", "新7系", 2019) #实例化对象my_car
print(my_car.car_information()) #通过对象调用方法,输出车基本信息
my_car.car_licheng() #通过对象调用方法,打印汽车行驶里程
输出:
BMW,新7系,2019
汽车已经行驶0公里
修改属性值的方法:
- 直接在类外通过对象调用属性修改值:
my_car.li_cheng = 100 #对象找到属性直接赋值
my_car.car_licheng() #打印
- 编写方法修改属性值:
class Car():
--snip--
#更新汽车行驶里程:
def update_licheng(self, mileage):
self.li_cheng = mileage
my_car.update_licheng(23)
my_car.car_licheng()
输出:
BMW,新7系,2019
汽车已经行驶23公里
Car类:继承(父类必须在子类前面)
基本概念:
- 编写的类是现有类的特殊版本,可由现成类继承编写新类
- 继承会自动获得父类的所有属性和方法,同时还可定义自己的属性和方法
格式:
class 子类名(父类名):
def _init_ (self,x,xx,xxx) :
super()._init_(x,xx)
子类属性=值
class Car():
"""模拟汽车"""
#初始化对象属性:车场,型号,生产时间
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.li_cheng = 0 #可以在初始化方法中设置属性默认值,无需定义形参
# 返回汽车信息
def car_information(self):
long_name = ("%s,%s,%d" %(self.make, self.model, self.year)) #类内直接使用属性
return long_name
#输出汽车行驶里程
def car_licheng(self):
print("汽车已经行驶%d公里" %self.li_cheng) #类内部直接使用属性
#更新汽车行驶里程:
def update_licheng(self, mileage):
self.li_cheng = mileage
#使用继承,编写子类方法:
class Electric_car(Car):
"""电动车类,继承普通汽车类"""
# 子类初始化方法
def __init__(self, make, model, year):
super().__init__(make, model, year) #调用父类初始化方法赋值
self.battery_size = 70 #设置子类的新属性
# 编写子类方法
def battary_inform(self):
print("电瓶电量还有%d" %self.battery_size)
my_electric_car = Electric_car("雅迪", "A8", 2020) #初始化子类对象
print(my_electric_car.car_information())
my_electric_car.battary_inform() #通过子类对象,可以调用子/父类所有方法
输出:
雅迪,A8,2020
电瓶电量还有70
- 重写父类方法:
当父类方法不符合子类行为时进行方法重写,子类方法名与父类方法名同名,子类对象调用方法使会忽略父类执行子类方法
#重写父类方法(只是假设,父类中没有此方法)
def gas_inform(self):
print("电动车没有汽油")
my_electric_car.gas_inform()
输出:
电动车没有汽油
- 将对象实例作为属性:
场景:属性和方法清单越来越长,需要将类的一部分作为独立的类分离出来
例如:不断给Electric_car添加细节,可能有许多是专门针对电瓶的属性和方法,可以将它们提取出来放入新类Battery中,并将Battery的实例作为Electric_car类的属性
class Car():
#--snip--
#"""电动车电瓶新类"""
class Battery():
def __init__(self, battery_size = 70):
self.battery_size = battery_size
def des_battery(self):
print("电动车电瓶电量还有%d" %self.battery_size)
#"""电动车子类"""
class Electric_car(Car):
def __init__(self, make, model, year):
super().__init__(make, model, year)
self.battery = Battery() #将电瓶类的实例对象存入属性
my_electric_car = Electric_car("雅迪", "A8", 2020)
my_electric_car.battery.des_battery()
输出:
电动车电量还有70
学习忠告:
只要代码像你希望的那样运行,就说明你做的很好!!即便你发现自己不得不做多次尝试使用不同方法重写类,也不必气馁;要编写出高效、准确的代码,都得经过这样的过程!!!
导入类
假设上面编写所有的类都存储在car.py文件中
- 导入单个类:from car import Car
- 导入多个类:from car import Car,Electric_car
- 导入整个模块:import car
学习忠告:
一开始应让代码结构尽可能简单,先尽可能在一个文件中完成所有工作,确定一切正常后,再将类移到独立的模块中
Python标准库
概念:python标准库是一组模块,安装并导入后,可以使用标准库中的任何函数和类
例如:有序字典,collections模块的OrderedDict类
from collections import OrderedDict
fav_lan = OrderedDict() #创建一个空的有序字典fav_lan
fav_lan["小明"] = "C"
fav_lan["小红"] = "pyhton"
fav_lan["小刚"] = "Java"
for k,v in fav_lan.items():
print("%s喜欢%s" %(k,v))
输出:
小明喜欢C
小红喜欢pyhton
小刚喜欢Java
编码风格
- 类名:使用驼峰命名法,单词首字母大写,不使用下划线
- 实例名/模块名:小写+下划线
- 类定义后添加文档字符串,简介类
- import先导入标准库函数,再导入自己编写模块