前言
一、配套视频
配套视频: https://www.bilibili.com/video/BV1ex411x7Em?from=search&seid=13312287313219257984
二、python基础初级
https://blog.csdn.net/weixin_51585624/article/details/116195258
三、python基础中级
https://blog.csdn.net/weixin_51585624/article/details/116203832
四、python基础高级
为方便大家学习,在此发布python基础入门部分配套讲义,原作者为黑马程序员, 前100节为Linux基础,所以我从100集开始记录,持续更新…
目录
python基础高级(封装、继承、多态)
01、类
class Cat: # 猫类
def eat(self):
print("小猫爱吃鱼")
def drink(self):
print("小猫要喝水")
# 创建猫对象
tom = Cat()
# 使用猫的方法
tom.eat()
tom.drink()
控制台结果
小猫爱吃鱼
小猫要喝水
Process finished with exit code 0
02、设置对象属性
class Cat: # 猫类
def eat(self):
# 哪一个对象调用的方法,self就是哪一个对象的引用
print("%s爱吃鱼" % self.name)
def drink(self):
print("%s要喝水" % self.name)
# 创建猫对象
tom = Cat() # 创建后,tom就有tom.name属性,tom.eat()、tom.drink()方法
# 可以使用 .属性名 利用赋值语句就可以了 在类的外部增加属性
tom.name = "Tom"
# 使用猫的方法
tom.eat()
tom.drink()
# 猫2
lazy_cat = Cat()
lazy_cat.name = "懒猫"
lazy_cat.eat()
lazy_cat.drink()
控制台结果
Tom爱吃鱼
Tom要喝水
懒猫爱吃鱼
懒猫要喝水
Process finished with exit code 0
03、__init__初始化方法
class Cat:
def __init__(self):
print("这是一个初始化方法")
self.name = "Tom" # 添加属性
# 使用类名创建对象的时候,会自动调用初始化方法__init__ 相当于c++中的默认构造函数
tom = Cat()
print(tom.name)
控制台结果
这是一个初始化方法
Tom
Process finished with exit code 0
04、利用参数设置属性初始化
class Cat:
def __init__(self, new_name):
print("这是一个初始化方法")
# self.name = "Tom" # 添加属性
self.name = new_name
def eat(self):
print("%s爱吃鱼" % self.name)
# 加上__init__()方法后,类才可以实例化,不加类就是个空壳,相当于一个方法集合
# 使用类名创建对象的时候,会自动调用初始化方法__init__ 相当于c++中的默认构造函数
tom = Cat("Tom") # 创建实例的时候,需要给实例绑定上属性,也方便类中的方法(函数)的定义
tom.eat()
lazy_cat = Cat("懒猫") # 懒猫调用Cat类
lazy_cat.eat()
控制台结果
这是一个初始化方法
Tom爱吃鱼
这是一个初始化方法
懒猫爱吃鱼
Process finished with exit code 0
05、__del__方法
# __del__方法
"""
当一个对象被创建时,会自动调用__init__方法
当一个对象被从内存中销毁前,会自动调用__del__方法 ,一般是整个程序执行完再执行,相当于c++中的析构函数
"""
class Cat:
def __init__(self, new_name):
self.name = new_name
print("%s 来了" % self.name)
def __del__(self):
print("%s去了" % self.name)
tom = Cat("Tom")
print("_" * 50)
控制台结果
Tom 来了
__________________________________________________
Tom去了
Process finished with exit code 0
06、__str__方法,描述类的方法
class Cat:
def __init__(self, new_name):
self.name = new_name
print("%s 来了" % self.name)
def __del__(self):
print("%s去了" % self.name)
def __str__(self): # 有返回值,描述方法
# 必须返回一个字符串
return "我是小猫[%s]" % self.name
tom = Cat("Tom")
print("_" * 50)
print(tom) # 有了__str__才能直接打印对象tom,一般不可以打印对象tom
控制台结果
Tom 来了
__________________________________________________
我是小猫[Tom]
Tom去了
Process finished with exit code 0
07、简单封装案例
class Person:
def __init__(self, name, weight):
self.name = name
self.weight = weight
def __str__(self):
return "我的名字叫%s体重是%.2f公斤" % (self.name, self.weight)
def run(self):
print("%s爱跑步,跑步锻炼身体" % self.name)
self.weight -= 0.5
def eat(self):
print("%s是吃货,吃完这顿再减肥" % self.name)
self.weight += 1
xiaoming = Person("小明", 75) # 传入类属性
xiaoming.eat()
xiaoming.run()
print(xiaoming)
控制台结果
小明是吃货,吃完这顿再减肥
小明爱跑步,跑步锻炼身体
我的名字叫小明体重是75.50公斤
Process finished with exit code 0
08、封装案例的使用1-跑步类
class Person:
def __init__(self, name, weight):
self.name = name
self.weight = weight
def __str__(self):
return "我的名字叫%s体重是%.2f公斤" % (self.name, self.weight)
def run(self):
print("%s爱跑步,跑步锻炼身体" % self.name)
self.weight -= 0.5
def eat(self):
print("%s是吃货,吃完这顿再减肥" % self.name)
self.weight += 1
xiaoming = Person("小明", 75)
xiaoming.eat()
xiaoming.run()
print(xiaoming)
# 小美爱跑步
xiaomei = Person("小美", 45)
xiaomei.eat()
xiaomei.run()
print(xiaomei)
控制台结果
小明是吃货,吃完这顿再减肥
小明爱跑步,跑步锻炼身体
我的名字叫小明体重是75.50公斤
小美是吃货,吃完这顿再减肥
小美爱跑步,跑步锻炼身体
我的名字叫小美体重是45.50公斤
Process finished with exit code 0
09、封装案例的使用2-家具类
class HouseItem: # 家具类
def __init__(self, name, area): # 初始化方法,传入2个属性
self.name = name
self.area = area
def __str__(self):
return "[%s]占地%.2f" % (self.name, self.area) #
class House:
def __init__(self, house_type, area):
self.house_type = house_type
self.area = area
# 剩余面积
self.free_area = area
# 家具列表
self.item_list = []
def __str__(self):
return ("户型:%s\n总面积:%.2f[剩余: %.2f]\n家具:%s"
% (self.house_type, self.area, self.free_area, self.item_list))
def add_item(self, item): # bed=item
print("要添加 %s" % item)
# 1、判断家具的面积
if item.area > self.free_area:
print("%s的面积太大了,无法添加" % item.name)
return
# 2、将家具的名称添加到列表中
self.item_list.append(item.name)
# 3、计算剩余面积
self.free_area -= item.area
# 创建家具对象
bed = HouseItem("席梦思", 20)
chest = HouseItem("衣柜", 20)
table = HouseItem("餐桌", 3)
print(bed) # 使用描述方法会自动调用__str__,可以直接描述bed对象
print(chest) # 使用描述方法__str__
print(table) # 使用描述方法__str__
# 创建房子对象
my_home = House("两室一厅", 60)
# 调用三次add_item方法,将三件家具以实参传递到add_item内部
my_home.add_item(bed) # bed 有2个属性name、area,同样也会传递进房子类中
my_home.add_item(chest) # 对象套用对象 my_home对象套用chest
my_home.add_item(table)
print(my_home) # 使用描述方法会自动调用__str__,可以直接描述my_home对象
控制台结果
[席梦思]占地20.00
[衣柜]占地20.00
[餐桌]占地3.00
要添加 [席梦思]占地20.00
要添加 [衣柜]占地20.00
要添加 [餐桌]占地3.00
户型:两室一厅
总面积:60.00[剩余: 17.00]
家具:['席梦思', '衣柜', '餐桌']
Process finished with exit code 0
10、封装案例的使用3-士兵类
# 枪类
class Gun:
def __init__(self, model): # 定义2个属性
self.model = model
self.bullet_count = 0
def add_bullet(self, count): # 装填子弹的方法
self.bullet_count += count
def shoot(self):
if self.bullet_count <= 0:
print("[%s]没有子弹了。。。" % self.model)
return
self.bullet_count -= 1 # 发射子弹
print("[%s]突突突...[%d]" % (self.model, self.bullet_count))
class Soldier:
def __init__(self, name):
self.name = name
self.gun = None
def fire(self):
# 判断士兵是否有枪
if self.gun is None:
print("[%s]还没有枪..." % self.name)
return
# 高喊口号
print("冲阿...[%s]" % self.name)
# 让枪装填子弹
self.gun.add_bullet(50) # 士兵调用 枪对象中的添加子弹方法 #对象嵌套
# 让枪发射子弹
self.gun.shoot()
ak47 = Gun("AK47")
# 创建许三多
xusanduo = Soldier("许三多")
xusanduo.gun = ak47 # 把枪类中的model、bullet_count属性和add_bullet、shoot方法传递进士兵类了
xusanduo.fire()
print(xusanduo.gun) # 因为没有__str__方法,所以描述不出来...
控制台结果
冲阿...[许三多]
[AK47]突突突...[49]
<__main__.Gun object at 0x000001E5A097DA48>
Process finished with exit code 0
11、私有属性、私有方法
'''
私有属性就是对象不希望公开的属性
在属性前加 __
私有方法就是对象不希望公开的方法
'''
class Women:
def __init__(self, name):
self.name = name
self.__age = 18 # 私有属性,在外界以及子类不能够被直接使用
def secret(self):
print("%s的年龄是%d" % (self.name, self.__age))
xiaofang = Women("小芳")
print(xiaofang) # 因为没有__str__方法,所以描述不出来...
xiaofang.secret()
控制台结果
<__main__.Women object at 0x00000264496DA308>
小芳的年龄是18
Process finished with exit code 0
12、继承—方法重写
class Dog:
def eat(self):
print("吃")
def drink(self):
print("喝")
def run(self):
print("跑")
def sleep(self):
print("睡")
def bark(self):
print("汪汪叫")
class xiaoTianQuan(Dog): # 继承
def fly(self):
print("我会飞")
def bark(self): # 重写父类方法
print("叫的跟神一样...")
super().bark() # 使用super(). 调用原本在父类中封装的方法
xtq = xiaoTianQuan()
xtq.run()
xtq.bark() # 调用的是子类方法
控制台结果
跑
叫的跟神一样...
汪汪叫
Process finished with exit code 0
13、多继承
# 子类可以拥有多个父类,并且具有所有父类的属性和方法
class A:
def test(self):
print("test 方法")
class B:
def demo(self):
print("demo方法")
class C(A, B): # 继承A和B
pass
c = C()
c.test()
c.demo()
控制台结果
test 方法
demo方法
Process finished with exit code 0
14、多态
# 多态 多个子类对应一个父类所产生不同的效果
# object类是全部类的祖先
class Dog(object):
def __init__(self,name):
self.name=name
def game(self):
print("%s蹦蹦跳跳的玩耍..."%self.name)
class XiaoTianQuan(Dog):
def game(self):
print("%s飞到天上去玩耍"%self.name)
class Person(object):
def __init__(self,name,):
self.name=name
def game_with_dog(self,dog):
print("%s和%s快乐的玩耍..."%(self.name,dog.name))
dog.game()
# 创建一个狗对象
# wangcai=Dog("旺财")
wangcai=XiaoTianQuan("飞天旺财")
# 创建一个小明
xiaoming=Person("小明")
# 让小明调用和狗玩的方法
xiaoming.game_with_dog(wangcai)
控制台结果
小明和飞天旺财快乐的玩耍...
飞天旺财飞到天上去玩耍
Process finished with exit code 0
15、类属性
class Tool(object):
# 使用赋值语句定义类属性,记录所有使用该类对象的数量
count = 0 # Tool类自己的属性
def __init__(self, name):
self.name = name
# 让类属性的值+1
Tool.count += 1
TOOL1 = Tool("斧头")
TOOL2 = Tool("狼头")
TOOL3 = Tool("锄头")
# 输出工具对象的总数,统计调用次数
print(Tool.count)
print(TOOL1.count)
控制台结果
3
3
Process finished with exit code 0
16、类方法
class Tool(object):
# 使用赋值语句定义类属性,记录所有使用该类对象的数量
count = 0 # Tool自己的属性
# 类方法 自己的方法
@classmethod
def show_tool_count(cls):
print("工具对象的数量%d" % cls.count)
def __init__(self, name):
self.name = name
# 让类属性的值+1
Tool.count += 1
# 创建工具对象
TOOL1 = Tool("斧头")
TOOL2 = Tool("狼头")
TOOL3 = Tool("锄头")
# 调用类方法
Tool.show_tool_count()
控制台结果
工具对象的数量3
Process finished with exit code 0
17、静态方法
# 不需要访问对象属性和类属性时,就可以直接用静态方法访问
class Dog(object):
@staticmethod
def run():
print("小狗要跑")
# 调用静态方法
Dog.run()
控制台结果
小狗要跑
Process finished with exit code 0
18、方法综合案例
class Game(object):
# 类属性 统计所调用对象的个数 历史最高分
top_score = 0
def __init__(self, player_name):
self.player_name = player_name
# 静态方法 谁都不访问,自己打印输出
@staticmethod
def show_help():
print("帮助信息:让僵尸进去房子")
# 类方法 显示历史最高分 只能访问类属性
@classmethod # 动态方法 配合自己的类属性top_score
def show_top_score(cls):
print("历史记录%d" % cls.top_score)
def start_game(self): # 实例对象方法
print("%s 开始游戏了..." % self.player_name)
# 查看游戏的帮助信息
Game.show_help() # 静态方法
# 察看历史的最高分
Game.show_top_score() # 类方法
# 创建游戏对象
game = Game("小明")
game.start_game()
控制台结果
帮助信息:让僵尸进去房子
历史记录0
小明 开始游戏了...
Process finished with exit code 0
19、__new__方法
class MusicPlayer(object):
def __new__(cls, *args, **kwargs): # 比__init__更优先级
# 创建对象时,new方法会被自动调用 必须要有return 才会执行__init__方法
print("创建对象,分配空间")
# 为对象分配空间
instance = super().__new__(cls)
# 返回对象的引用
return instance
def __init__(self):
print("播放器初始化")
# 创建播放器对象
player = MusicPlayer()
print(player)
控制台结果
创建对象,分配空间
播放器初始化
<__main__.MusicPlayer object at 0x000001F806B6AEC8>
Process finished with exit code 0
20、单例1
"""
单例
多个子类调用同一个父类时,一般每个子类所调用父类的地址都各不相同
单例的目的是让每个子类所调用的父类地址总是保持一致
"""
class MusicPlayer(object):
pass
play1 = MusicPlayer()
print(play1)
play2 = MusicPlayer()
print(play2)
控制台结果
<__main__.MusicPlayer object at 0x0000017D4ADA4348>
<__main__.MusicPlayer object at 0x0000017D4ADB8AC8>
Process finished with exit code 0
21、单例2
"""
单例
多个子类调用同一个父类时,一般每个子类所调用父类的地址都各不相同
单例的目的是让每个子类所调用的父类地址总是保持一致
"""
class MusicPlayer(object):
# 记录第一个被创建对象的引用(类属性)
isinstance = None
def __new__(cls, *args, **kwargs):
# 判断类属性是否为空对象
if cls.isinstance is None:
# 调用父类的方法,为第一个对象分配空间 父类是object
cls.isinstance = super().__new__(cls)
# 返回类属性保存的对象引用
return cls.isinstance
play1 = MusicPlayer()
print(play1)
play2 = MusicPlayer()
print(play2)
控制台结果
<__main__.MusicPlayer object at 0x0000021BE330A508>
<__main__.MusicPlayer object at 0x0000021BE330A508>
Process finished with exit code 0
22、单例初始化
"""
单例
多个子类调用同一个父类时,一般每个子类所调用父类的地址都各不相同
单例的目的是让每个子类所调用的父类地址总是保持一致
"""
# 只初始化一次 只执行一次__init__
class MusicPlayer(object):
# 记录第一个被创建对象的引用(类属性)
isinstance = None
# 记录是否执行过初始化动作
init_flag = False
def __new__(cls, *args, **kwargs):
# 判断类属性是否为空对象
if cls.isinstance is None:
# 调用父类的方法,为第一个对象分配空间 父类是object
cls.isinstance = super().__new__(cls)
# 返回类属性保存的对象引用
return cls.isinstance
def __init__(self):
# 判断是否执行过初始化动作
if MusicPlayer.init_flag:
return
# 如果没有执行过,再执行初始话动作
print("初始化播放器")
# 修改类属性的标记
MusicPlayer.init_flag = True
play1 = MusicPlayer()
print(play1)
play2 = MusicPlayer()
print(play2)
控制台结果
<__main__.MusicPlayer object at 0x0000018519A5D3C8>
<__main__.MusicPlayer object at 0x0000018519A5D3C8>
Process finished with exit code 0
23、异常
try:
# 不能确定正确执行的代码
num = int(input("请输入一个整数:"))
print(num)
except:
# 错误的处理代码
print("请输入正确的整数")
print("_" * 50)
控制台结果
请输入一个整数:a
请输入正确的整数
__________________________________________________
Process finished with exit code 0
24、捕获异常
try:
# 不能确定正确执行的代码
num = int(input("请输入一个整数:"))
print(num)
except Exception as result: # 把控制台输出的错误打印出来
# 错误的处理代码
print("未知错误%s" % result)
else: # 程序正常执行完了,就会执行该代码
print("尝试成功")
finally:
print("无论是否正确执行代码,都会执行该finally")
控制台结果
请输入一个整数:a
未知错误invalid literal for int() with base 10: 'a'
无论是否正确执行代码,都会执行该finally
Process finished with exit code 0
25、模块
"""
局部导入,直接使用该工具名,使用时不需模块名.方法,直接方法使用
只希望从某一个模块中,导入部分工具,就可以使用from...import的方式
from...import
from 模块名 import 工具名
from 模块 import * 导入模块中所有工具
"""
26、模块执的独立性
# 如果直接执行模块代码,__main__
print("模块代码")
def domo():
print("domo函数")
if __name__ == "__main__": # 自己运行 才会使用下面代码
print(__name__)
print("模块代码自己用,别人调的话就执行不了")
控制台结果
模块代码
__main__
模块代码自己用,别人调的话就执行不了
Process finished with exit code 0
27、文本操作
"""
open 打开文件,并且返回文件操作对象,
一般路径前加 r(默认) 只读方式打开
加 a 以追加的方式打开文件,文件可以被添加内容
read 将文件内容读取到内存中
write 将指定内容写入文件
close 关闭文件
readline方法 可以一次读取一行内容,需要配合 while 循环
"""
file = open("D:/2021/Cnnlearning/pycharm-write/pycharm学习笔记.txt")
text = file.read()
print(text)
file.close()
控制台结果
成功的唯一秘诀--坚持最后一分钟
成功的唯一秘诀--坚持最后一分钟
成功的唯一秘诀--坚持最后一分钟
成功的唯一秘诀--坚持最后一分钟
成功的唯一秘诀--坚持最后一分钟
成功的唯一秘诀--坚持最后一分钟