python3 重要知识点3
https://www.bilibili.com/video/BV1NM4y1K73T?p=51&spm_id_from=pageDriver&vd_source=7963e4096d2b51e52877519dc0202e3e
视频教学
1.面向对象: 把相关的数据和方法看成一个整体,关系抽象为类、继承,它将对象作为程序的基本单元,将程序和数据封装在其中,以提高系统的重用性。
2.定义类、定义对象、调用对象
#定义类
class MianShi(): #括号里可以不写object,默认写进去了
def __init__(self,name,id,age): #用来做变量初始化
self.name = name
self.id = id
self.age = age
def info(self):
print("准备简历")
def learn(self):
pass
def aspect(self):
print("我的姓名是:",self.name)
print("我的年龄是:",self.age)
#定义对象
soft = MianShi("zhaoyun",1,16)
#使用函数
soft.info()
soft.aspect()
输出结果为:
准备简历
我的姓名是: zhaoyun
我的年龄是: 16
说明:
新式类为 class 类名(object):
object是所有类的最顶级父类
类名采用大驼峰命名法
info是一个实例方法,第一个参数一般是self,即实例对象本身,当然也可以把self换成其他名字,即表示一个变量,这个变量指向了实例对象。
pass:什么都不做,如果函数里什么都没有,不写pass会报错。
初始化: init(self, 属性),默认有一个参数名字为self,如果传递了2个实参,则为__init__(self,x,y)
注意:
在类内获取属性和方法,通过self获取
在类外获取属性和方法,通过对象名获取
一个类有多个对象,每个对象的属性各自保存,有各自独立的地址
方法是所有对象共享的,只占一份内存,类通过self判断哪个对象调用了方法
3.魔方方法: 魔法方法是自动调用的,只要写上去了,即使不执行也会执行。如果有__xxx__()的,就有特殊功能,称为魔法方法,
str用来输出对象时的展开描述,当使用print输出对象时,默认打印对象的内存地址,如果定义了__str__(self)方法,就会打印这个方法的return的数据,通常返回一个字符串,作为这个对象的描述信息。
init用来初始化对象
del用来删除对象。回收对象的时候会自动调用。
#定义类
class MianShi(): #括号里可以不写object,默认写进去了
def __init__(self,name,id,age):
self.name = name
self.id = id
self.age = age
def info(self):
print("准备简历")
def learn(self):
pass
def aspect(self):
print("我的姓名是:",self.name)
print("我的年龄是:",self.age)
def __str__(self):
return ("我的姓名是:%s,我的id是:%d,我的年龄是%d" %(self.name,self.id,self.age))
def __del__(self):
print(f"{self.name}已经被查看了")
#定义对象
soft = MianShi("zhaoyun",1,16)
#使用函数
soft.info()
soft.aspect()
#打印对象
print(soft) #没有str函数,原本输出:<__main__.MianShi object at 0x00000204A2837740>
#有了__str__后,输出:我的姓名是:zhaoyun,我的id是:1,我的年龄是16
# del soft
输出:
准备简历
我的姓名是: zhaoyun
我的年龄是: 16
我的姓名是:zhaoyun,我的id是:1,我的年龄是16
zhaoyun已经被查看了
4.继承
指多个类之间的所属关系,如果一个类A里面的属性和方法可以复用,则可以通过继承的方式,传到类B里,那类A就是基类,也叫父类,类B叫派生类,也叫子类。
一、单继承:
class Master(object):
def __init__(self):
self.kongfu = "老派煎饼果子配方"
def make_cake(self):
print(f"使用了{self.kongfu},制作了一个煎饼果子")
# shifu = Master()
# shifu.make_cake()
class DaMao(Master):
pass #占位置的功能
damao = DaMao()
damao.make_cake() #输出:使用了老派煎饼果子配方,制作了一个煎饼果子
子类在继承时,小括号里是父类名字,
子类默认继承父类的__init__方法
父类的属性方法都会被继承
二、多继承:
class Master(object):
def __init__(self):
self.kongfu = "老派煎饼果子配方"
def make_cake(self):
print(f"使用了{self.kongfu},制作了一个煎饼果子")
def play_zima(self):
print(f"使用了芝麻")
# shifu = Master()
# shifu.make_cake()
class School(object):
def __init__(self):
self.kongfu = "现代煎饼果子配方"
def make_cake(self):
print(f"使用了{self.kongfu},制作了一个煎饼果子")
def play_shala(self):
print(f"使用了沙拉")
class DaMao(Master,School):
pass #占位置的功能
damao = DaMao()
damao.make_cake() #如果换成class DaMao(School,Master)结果就会输出:使用了现代煎饼果子配方,制作了一个煎饼果子
damao.play_shala()
damao.play_zima()
输出:
使用了老派煎饼果子配方,制作了一个煎饼果子
使用了沙拉
使用了芝麻
原因是:如果继承了两个或以上的类时,
如果多个父类中有同名的属性和方法,默认使用第一个父类的方法。
如果不重名,那都可以使用。
三、子类重写父类的同名属性和方法
class Master(object):
def __init__(self):
self.kongfu = "老派煎饼果子配方"
def make_cake(self):
print(f"使用了{self.kongfu},制作了一个煎饼果子")
def play_zima(self):
print(f"使用了芝麻")
# shifu = Master()
# shifu.make_cake()
class School(object):
def __init__(self):
self.kongfu = "现代煎饼果子配方"
def make_cake(self):
print(f"使用了{self.kongfu},制作了一个煎饼果子")
def play_shala(self):
print(f"使用了沙拉")
class DaMao(Master,School):
def __init__(self):
self.kongfu = "猫式煎饼果子配方"
def make_cake(self):
print(f"使用了{self.kongfu},制作了一个煎饼果子")
damao = DaMao()
damao.make_cake()
damao.play_shala()
damao.play_zima()
输出:
使用了猫式煎饼果子配方,制作了一个煎饼果子
使用了沙拉
使用了芝麻
分析:如果子类和父类有同名方法和属性时,默认使用子类!
(最优先级肯定是自己,自己没有再找其他)
四、子类调用父类的同名属性和方法
class Master(object):
def __init__(self):
self.kongfu = "老派煎饼果子配方"
def make_cake(self):
print(f"使用了{self.kongfu},制作了一个煎饼果子")
def play_zima(self):
print(f"使用了芝麻")
class School(object):
def __init__(self):
self.kongfu = "现代煎饼果子配方"
def make_cake(self):
print(f"使用了{self.kongfu},制作了一个煎饼果子")
def play_shala(self):
print(f"使用了沙拉")
class DaMao(Master,School):
def __init__(self):
self.kongfu = "猫式煎饼果子配方"
def make_cake(self): #重写方法
print(f"使用了{self.kongfu},制作了一个煎饼果子")
def make_oldcake(self): #调用老派
Master.__init__(self)
self.make_cake()
def make_moderncake(self): #调用现代
School.__init__(self)
self.make_cake()
damao = DaMao()
damao.make_cake() #调用猫式配方
damao.make_oldcake() #调用老派配方
damao.make_moderncake() #调用现代煎饼配方
damao.make_cake()
输出结果为:
使用了猫式煎饼果子配方,制作了一个煎饼果子
使用了老派煎饼果子配方,制作了一个煎饼果子
使用了现代煎饼果子配方,制作了一个煎饼果子
使用了现代煎饼果子配方,制作了一个煎饼果子
原因是:调用父类方法,可以通过执行父类的__init__方法修改self的属性,然后调用父类名.方法(self)
注意:无论何时,self都表示子类的对象,在调用父类时,传递self参数,来控制方法和属性的访问修改。
五、super() 可以用来逐一调用所有的父类方法,并且只执行一次,调用顺序也遵循mro类属性的顺序,若继承了多个父类,且父类都有同名方法,默认只执行第一个父类的,不支持执行多个父类的同名方法,通常用于单继承的多层继承
def make_oldcake(self): #调用老派
Master.__init__(self)
super().make_cake()
damao.make_oldcake() #输出:使用了老派煎饼果子配方,制作了一个煎饼果子
5.文件作用: 把一些数据存放起来,可以让程序下一次执行的时候直接使用
要习惯按ctrl+s,保存。
6.文件操作:
文件访问模式有:
先在pycharm同一目录下创建了一个test.txt文件(右击文件夹–>new–>file–>输入test.txt–>确认),内容为如下:
一个完整的读取文件流程:
打开:f = open(“文件名”,“w”) #(文件名,访问模式)->读取–>写入–>备份
#1打开文件:
#代码和文件在同一目录,可以只写文件名,不在则要加目录。
# 有中文要加encoding="utf-8"
file = open("test.txt","r",encoding="utf-8")
#2读取文件:把硬盘里的文件加载进内存中,
print(file.read()) #读取整个文件
输出:
hhhhhhhhhhhh
有意思
file = open("test.txt","r",encoding="utf-8")
#2读取文件:把硬盘里的文件加载进内存中,
# print(file.read()) #读取整个文件所有的数据
print(file.read(5)) #读取前五个字符,读取数据的长度,单位是字节。
print("分割线")
print(file.read()) #接着上面没读完的继续读取,即读取剩下部分
输出:
hhhhh
分割线
hhhhhhh
有意思
file = open("test.txt","r",encoding="utf-8")
# 当文件足够大的时候,内存不够加载整个文件,选择加载一部分
print(file.readline()) #读取一行
print("分割线")
print(file.readline()) #读取下一行
输出:
hhhhhhhhhhhh
分割线
有意思
file = open("test.txt","r",encoding="utf-8")
print(file.readlines()) #读取每行数据放在列表里
输出:[‘hhhhhhhhhhhh\n’, ‘有意思’]
写入文件方式:
#以写的方式打开文件
file = open("write.txt","w")
#写入数据,
file.write("hello,world")
#关闭文档
file.close() #file内容为:hello,world
#以追加的方式写入文件
file = open("write.txt","a")
#写入数据,
file.write("hello,world\n")#换行是\n,不是/n
#关闭文档
file.close()
#输出:
#hello,world
#hello,world
文件备份: