python基础笔记(三)

前言

一、配套视频

配套视频: 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()
控制台结果

成功的唯一秘诀--坚持最后一分钟
成功的唯一秘诀--坚持最后一分钟
成功的唯一秘诀--坚持最后一分钟
成功的唯一秘诀--坚持最后一分钟
成功的唯一秘诀--坚持最后一分钟
成功的唯一秘诀--坚持最后一分钟

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值