Python全栈最全学习之路-Python基础(七)

面向对象初级

一、面向对象介绍

思考一:在之前学习的基础上,已经能够处理实现很多功能,比如我们可以定义一个关于人相关的内容,但是如果要表示很多人该怎么办呢?
  • 加粗样式面向对象介绍
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('四川人爱打雀雀儿')

在这里插入图片描述
通过继承可以很好的提高代码的复用性
通过在类后面的跟上要继承的来确定父类

  • 继承的名词解释
    GuangDongSiChuan称为是Person子类,也可以成为派生类
    Person称为是GuangDongSiChuan父类,也是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、余额

参考代码下期见
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值