面向对象初级
一、面向对象介绍
思考一:在之前学习的基础上,已经能够处理实现很多功能,比如我们可以定义一个关于人相关的内容,但是如果要表示很多人该怎么办呢?
- 加粗样式面向对象介绍
name = '不动' # 定义姓名
age = 18
name1 = '如山'
age1 = 18
def play1(name):
print('%s 正在玩游戏---' % name)
def search1(name):
print('%s 正在查资料---' % name)
描述一个人的信息和行为很容易,但是代码肯定是要处理很多人的,这个时候该怎么办?
如果使用相同的变量名,则肯定会冲突,但是如果使用不同的变量名,则会变得非常麻烦,同时别人如何知道关于人已经定义哪些东西了呢?
借鉴函数的封装思想,再次对函数和变量进行封装,来提高代码的复用性
class Person:
name = '不动'
age = 18
def play(name):
print('%s 正在玩游戏---' % name)
def search(nmae):
print('%s 正在查资料---' % name)
通过这样的封装,把和人相关的变量、函数等放在了一起,只要找到这个部分代码,就能知道关于人已经定义了哪些变量和函数
为了便于区分,把用关键字class定义的代码块称为类
在类里面的变量称为类的属性
在类里面的函数称为类的方法
-
面向对象介绍-名词解释
类:一类的意思,人是一个类,狗也是一个类,车也是一个类,因为他们有很多种。可以说成是一个人(人能做的事情很多)、狗(也可以干很多事情)、车(也很多)
属性:人有人的属性,狗有狗的属性,车也有车的。比如人(名字、年龄、性别),狗(颜色、品种、性别)
方法:方法(解决某个问题采用的方式方法)就好比动作,人可以干嘛,狗可以干嘛,车可以干嘛。比如车(漂移、加速),人(写作业、吃饭、睡觉) -
面向对象的作用
面向过程(比如吃面条)
买面条 洗锅 烧水 煮面条 吃面
面向对象
进商店 点菜 吃面条
从上面可以看到面向过程对面系那个对象要长,要复杂 -
面向过程和面向对象对比
面向过程:
变量和函数。“散落”在文件的各个位置,甚至是不同文件中。
看不出变量和函数的相关性,非常不利于维护,设计模式不清晰
经常导致程序员,忘记某个变量的相关性,而导致无法检测的错误
面向对象:
相关的变量和函数都“封装”在对象里,以对象为单位来管理代码。
变量与函数的相关性清晰,利于维护,设计模式清晰。
程序员可以配合“继承”来提高代码的可重用行,加强合作开发。 -
面向对象的总结
面向对象:
用面向对象的思维去解决问题。
将某一类事物相关的属性和方法封装在一起,用来表示这类事物
二、类定义和使用思考一:刚才看到了类带来的方便之外,但是刚才类好像也只能表示一个人,如果要表示多个人该怎么办呢? 思考二:需要满足两点:第一能表示不同的人,且相互不影响;第二:方法调用更加简单点,使用过程中不需要太复杂
-
类的定义
class Person:
def __init__(self,name,age,sex='男'):
self.name = name
self.age =age
self.sex = sex
def play(self):
print('%s 正在玩游戏---' % self.name)
def search(self):
print('%s 正在找资料---' % self.name)
bd称为Person类的实例,这里语境的意思是具体的某个人
self是实例自己
__init__是初始化函数,在实例化时会自动的调用
实例通过点**(.)**操作符来调用属性或方法
- 类的实例化
xiaoyu = Person('小宇',18)
moran.__init__('小宇',18)
Person.__init__(xiaoyu,'小宇',18)
分析一波,上述是层层递进的,我们先实例化一个类,然后类里面是怎么走的,定义完以后,他会根据他的初始化进行初始,把”‘小宇’“赋值给”self.name“,”18“赋值给”self.age“,然后那个self就是实例本身。
self的值由Python自动传入,self也就是实例本身
- 类的析构函数
class Person:
def __init__(self,name,age,sex='男'):
self.name = name
self.age =age
self.sex = sex
def play(self):
print('%s 正在玩游戏---' % self.name)
def search(self):
print('%s 正在找资料---' % self.name)
def __del__(self):
print('%s 事情做完了---' % self.name)
在类中增加__del__函数,当删除实例的时候,就会调用此方法
del关键字用来删除对象
-
总结
1、实例化
掌握:类的实例化方法
2、self
理解:self代表的意思
3、init
掌握:初始化函数的使用
4、del
掌握:析构函数的用法
三、继承和重用思考一:人有人多区别,比如广东人爱喝茶,四川人爱麻将,都是play方法,但是怎样表示不同结果呢? 思考二:如果分别定义广东人和四川人的类,那么多代码是重复的,有没有解决办法呢?
-
继承
class Person:
def __init__(self,name,age,sex='男'):
self.name = name
self.age =age
self.sex = sex
def play(self):
print('%s 正在玩游戏---' % self.name)
def search(self):
print('%s 正在找资料---' % self.name)
def __del__(self):
print('%s 事情做完了---' % self.name)
class GuangDong(Person):
def play(self):
print('广东人爱喝茶')
class SiChuan(Person):
def play(self):
print('四川人爱打雀雀儿')
通过继承可以很好的提高代码的复用性
通过在类后面的跟上要继承的来确定父类
-
继承的名词解释
GuangDong、SiChuan称为是Person的子类,也可以成为派生类
Person称为是GuangDong和SiChuan的父类,也是object的子类
object成为是所有类的父类 -
重用
class GuangDong(Person):
def play(self):
print('广东人爱喝茶')
Person.play(self) # 方法一
super().play() # 方法二 推荐使用此方法
重用:
子类重新定义父类的方法,让同意方法有不同的行为
如果子类想继续使用父类的行为,推荐使用super函数来实现
-
总结
1、继承
掌握:类继承方法和作用
2、objiect
了解:所有的类都是继承object
3、重用
掌握:子类重新定义父类方法
4、super
掌握:super方法的使用
四、多继承思考一:现在一个广东人和四川人生了一个孩子,这个时候,该怎么表示这种关系呢?
-
多继承
class HunXue(GuangDong,SiChuan):
def play(self):
print('%s 即爱喝茶,又喜欢打麻将' % self.name)
super().play()
多继承时,只需要在继承时增加需要继承的类即可
虽然有继承SiChuan类,但是并没有调用SiChuan类的play方法,但为什么打印了它的方法
-
多继承的继承顺序
通过调用__base__和__bases__可以查看到,类继承的第一个和所有类
通过mro方法可以看到类的mro查找顺序
Python对于所有磊会自动生成mro查找顺序,此顺序决定了向上查找方法的过程
五、本节课总结
1、面向对象
理解:面向对象编程的优势
2、类的定义和使用
掌握:类的定义和类的实例化
理解:self的作用
掌握:初始化函数和析构函数的应用
3、继承
掌握:继承的用法和作用
4、多继承
掌握:mro的继承规则
六、上节课作业参考代码如下
1、利用datetime模块,批量生成6月份每天的txt文件
2、生成上面的文件之后,再一次在每个文件中写入文件名
3、将上面生成的所有文件名之后加上‘_NEW’
from datetime import *
import os
def zuoye():
begin_date = date(2020,6,1)
end_date = date(2020,6,30)
while begin_date <= end_date:
file_date = begin_date.strftime('%Y-%m-%d')
with open('{}.txt'.format(file_date),'w+',encoding='utf-8') as f:
f.write(file_date)
begin_date += timedelta(days=1)
for i in range(1,31):
if i < 10:
os.rename('2020-06-0{}.txt'.format(i),'2020-06-0{}_NEW.txt'.format(i))
elif i >= 10:
os.rename('2020-06-{}.txt'.format(i),'2020-06-{}_NEW.txt'.format(i))
4、假设有一个英文文本文件,编写一个程序读取其内容,并将里面的大写字母
变成小写字母,小写字母变成大写字母(字符串swapcase方法)
with open('html.txt','r+') as f:
str_1 = f.read()
str_2 = str_1.swapcase()
f.seek(0)
f.write(str_2)
七、作业
1、定义一个账户类,可以创建账户、存款、取款 、查询余额、以及销户等操作
2、现在三个人分别去开户,存款 和 销户,请利用上面的类实现出来
提示:账户必备要素:1、账户名 2、密码 3、余额
参考代码下期见