03 - python基础篇

news2024/11/19 23:26:45

1. 面向对象认识

1.1 面向过程

核心:怎么做

  • 把需要完成的业务逻辑,所有步骤从头到尾逐步实现
  • 将某些功能独立的代码封装成函数
  • 最后,就是顺序调用不同的函数

注重步骤与过程,不注重职责分工。

1.2 面向对象

核心:谁来做

  • 在做业务之前,首先确定职责 - 要做的事情
  • 根据职责创建不同的对象,在对象内部封装不同的对象方法
  • 最后,顺序地让不同的对象调用不同的方法

注重对象和职责,不同的对象承担不同的职责。

2. 类和对象

2.1 类

类是对一群具有相同特征或者行为的事物的一个统称。

相当于是制造汽车的图纸。

类的设计

  • 类名:一类事物的统称,采用大驼峰命名法(单词首字母大写,单词之间没有下划线)
  • 属性:这类事物具有什么样的特征
  • 方法:这类事物具有什么样的行为

2.2 对象

对象是由抽象的类创建出来的一个具体的存在。

相当于是根据图纸制造出来的真的汽车。

2.3 类与对象的关系

  • 先有类,后有对象
  • 类只有一个,对象可以创建多个
  • 类中定义了什么属性和方法,对象中就有什么属性和方法

3. 面向对象基础语法

3.1 内置函数

__方法名__ 格式的方法是python提供的内置属性/方法,如:

3.2 定义类

class 类名:

    def 方法1(self, 参数列表):
        pass
    
    def 方法2(self, 参数列表):
        pass

创建一个猫对象

class Cat:
    """这是一个猫类"""

    def eat(self):
        print("小猫爱吃鱼")

    def drink(self):
        print("小猫在喝水")

  •  在类的外部,通过 变量名. 访问对象的属性和方法
  • 在类封装的方法中,通过 self. 访问对象的属性和方法

3.3 创建对象

对象变量 = 类名()

创建小猫对象

tom = Cat()
tom.drink()
tom.eat()

3.4 对象初始化

在创建对象的同时,设置对象的属性,相当于java的构造函数

class Cat:

    def __init__(self, name):
        print("初始化方法 %s" % name)
        self.name = name
    ...
    
tom = Cat("Tom")
...

lazy_cat = Cat("大懒猫")
...

3.5 私有属性和私有方法

在有些业务中,对象的某些属性或方法,只希望在对象的内部使用,不希望在外部访问。即对象不希望公开的属性和方法。

定义方式:在定义属性或方法时,在属性名或者方法名前增加两个下划线。

示例:女生的年龄你不要问

class Women:

    def __init__(self, name):

        self.name = name
        self.__age = 18

    def __secret(self):
        print("我的年龄是 %d" % self.__age)


xiaofang = Women("小芳")
# 私有属性,外部不能直接访问
# print(xiaofang.__age)

# 私有方法,外部不能直接调用
# xiaofang.__secret()

但是,在python中并没有真正意义上的匿名,你可以通过某些方式访问,如:

# 访问私有属性
print(xiaofang._Women__age)

# 访问私有方法
xiaofang._Women__secret()

3.6 类属性和类方法

  • 每一个对象都有自己独立的内存空间,保存各自不同的属性
  • 多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用传递到方法内部

类属性

类属性就是给类对象中定义的属性,通常用来记录与这个类相关的特征,不会用于记录具体对象的特征。

示例

class Tool(object):

    # 使用赋值语句,定义类属性,记录创建工具对象的总数
    count = 0

    def __init__(self, name):
        self.name = name

        # 针对类属性做一个计数+1
        Tool.count += 1


# 创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("榔头")
tool3 = Tool("铁锹")

# 知道使用 Tool 类到底创建了多少个对象?
print("现在创建了 %d 个工具" % Tool.count)

类方法

类方法就是针对类对象定义的方法,在类方法内部可以直接访问类属性或者调用其他的类方法。

语法:

@classmethod
def 类方法名(cls):
    pass
  •  类方法需要用修饰器 @classmethod 来标识
  • 第一个参数是cls
  • 在方法内部,可以通过cls.访问类的属性,通过cls.调用其他类方法

静态方法

如果既不需要访问实例属性或者调用实例方法,也不需要访问类属性或者调用类方法,这个时候就可以把这个方法封装成一个静态方法。

语法:

@staticmethod
def 静态方法名():
    pass
  • 静态方法用修饰器 @staticmethod来标识
  • 通过类名.调用静态方法

示例

class Game(object):

    # 游戏最高分,类属性
    top_score = 0

    @staticmethod
    def show_help():
        print("帮助信息:让僵尸走进房间")
        
    @classmethod
    def show_top_score(cls):
        print("游戏最高分是 %d" % cls.top_score)

    def __init__(self, player_name):
        self.player_name = player_name

    def start_game(self):
        print("[%s] 开始游戏..." % self.player_name)
        
        # 使用类名.修改历史最高分
        Game.top_score = 999

# 1. 查看游戏帮助
Game.show_help()

# 2. 查看游戏最高分
Game.show_top_score()

# 3. 创建游戏对象,开始游戏
game = Game("小明")

game.start_game()

# 4. 游戏结束,查看游戏最高分
Game.show_top_score()

4 继承

4.1 继承的基本概念

实现代码的重用,相同的代码不需要重复编写。

子类拥有父类的所有方法和属性。

语法:
 

class 类名(父类名):

    pass

4.2 方法的重写

子类继承自父类,可以直接享受父类中已经封装好的方法。

当父类的方法实现不能满足子类的需求时,可以对方法进行重写。

重写父类方法的两种情况:

  1. 覆盖父类的方法
  2. 对父类方法进行扩展

覆盖父类的方法:

如果在开发中,父类方法的实现和子类的方法实现,完全不同,可以采用覆盖的方式,在子类中重新编写父类的方法实现。在程序调用时,会直接调用之类中的重写方法。

对父类方法进行扩展:

在子类中重写父类的方法,在特定的位置上使用 super().父类方法 来调用父类方法的执行,相当于是父类原本的方法实现是子类方法其中的一部分。

4.3 多继承

子类可以拥有多个父类,并且具有所有父类的属性和方法。

语法:

class 子类名(父类名1, 父类名2...)
    pass

4.4 基类

object是python为所有对象提供的基类,提供有一些内置的属性和方法。

在python3中,定义类时,如果没有指定父类,会默认使用object类作为该类的基类。

5. 多态

不同的子类对象调用相同的父类方法,产生不同的执行结果,增加代码的灵活度。

示例

class Dog(object):

    def __init__(self, name):
        self.name = name

    def game(self):
        print("%s 蹦蹦跳跳的玩耍..." % self.name)


class XiaoTianDog(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()


# 1. 创建一个狗对象
wangcai = XiaoTianDog("飞天旺财")

# 2. 创建一个小明对象
xiaoming = Person("小明")

# 3. 让小明调用和狗玩的方法
xiaoming.game_with_dog(wangcai)

person类只需要让狗对象调用game方法,不用关心具体是什么狗,在程序执行时,传入不同的狗对象实参,就会产生不同的执行效果。

6. 单例

让类创建的对象,在系统中只有唯一的一个实例,每一次执行类名()返回的对象,内存地址是相同的。让初始化动作只被执行一次

如:打印机、回收站、音乐播放器。

正常情况

class MusicPlayer(object):

    def __new__(cls, *args, **kwargs):
        # 如果不返回任何结果,
        return super().__new__(cls)

    def __init__(self):
        print("初始化音乐播放对象")

player = MusicPlayer()

print(player)

单例情况

class MusicPlayer(object):

    # 定义类属性记录单例对象引用
    instance = None

    def __new__(cls, *args, **kwargs):

        # 1. 判断类属性是否已经被赋值
        if cls.instance is None:
            cls.instance = super().__new__(cls)

        # 2. 返回类属性的单例引用
        return cls.instance

7. 异常

异常基础

  • 程序在运行时,如果遇到了错误,会停止程序的执行,并且提示一些错误信息,这就是异常
  • 程序停止执行并且提示错误信息这个动作,我们通常称之为:抛出异常
  • 程序开发时,很难将所有的情况都处理到,通过异常捕获可以针对突发事件做集中的处理,从而保证程序的稳定性和健壮性

自定义异常

class TooLongExceptin(Exception):
    "this is user's Exception for check the length of name "
    def __init__(self,leng):
        self.leng = leng
    def __str__(self):
        print("姓名长度是"+str(self.leng)+",超过长度了")

异常捕获语法示例

try:
    # 尝试执行的代码
    pass
except 错误类型1:
    # 针对错误类型1,对应的代码处理
    pass
except 错误类型2:
    # 针对错误类型2,对应的代码处理
    pass
except (错误类型3, 错误类型4):
    # 针对错误类型3 和 4,对应的代码处理
    pass
except Exception as result:
    # 打印错误信息
    print(result)
else:
    # 没有异常才会执行的代码
    pass
finally:
    # 无论是否有异常,都会执行的代码
    print("无论是否有异常,都会执行的代码")

    else 只有在没有异常时才会执行的代码

    finally 无论是否有异常,都会执行的代码

    之前一个演练的 完整捕获异常 的代码如下:

try:
    num = int(input("请输入整数:"))
    result = 8 / num
    print(result)
except ValueError:
    print("请输入正确的整数")
except ZeroDivisionError:
    print("除 0 错误")
except Exception as result:
    print("未知错误 %s" % result)
else:
    print("正常执行")
finally:
    print("执行完成,但是不保证正确")

 raise抛出异常

在业务开发中,除了代码执行错误,python会抛出异常之外,还需要主动抛出异常,由其他需要处理的函数捕获异常。相当于java 中的throw

示例

def input_password():

    # 1. 提示用户输入密码
    pwd = input("请输入密码:")

    # 2. 判断密码长度,如果长度 >= 8,返回用户输入的密码
    if len(pwd) >= 8:
        return pwd

    # 3. 密码长度不够,需要抛出异常
    # 1> 创建异常对象 - 使用异常的错误信息字符串作为参数
    ex = Exception("密码长度不够")

    # 2> 抛出异常对象
    raise ex

try:
    user_pwd = input_password()
    print(user_pwd)
except Exception as result:
    print("发现错误:%s" % result)


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1428103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【智慧农业】东胜物联温室监控系统硬件解决方案,自动化控制温室灯光、温湿度等

温室监控系统旨在提高智慧农业的工业生产率和效率。根据最近的一项研究,农业领域的物联网市场预计到2026年将达到约187亿美元。物联网技术包括自主耕作方法,帮助农场生产高质量的商品,并为农场经理提供最佳功能。某上市药企因业务需要&#x…

【Java 数据结构】对象的比较

Java中对象的比较 1. PriorityQueue中插入对象2. 元素的比较2.1 基本类型的比较2.2 对象比较的问题 3. 对象的比较3.1 覆写基类的equals3.2 基于Comparble接口类的比较3.3 基于比较器比较3.4 三种方式对比 4. 集合框架中PriorityQueue的比较方式5. 使用PriorityQueue创建大小堆…

Json序列化和反序列化 笔记

跟着施磊老师学C 下载&#xff1a;GitHub - nlohmann/json: JSON for Modern C 在single_include/nlohmann里头有一个json.hpp&#xff0c;把它放到我们的项目中就可以了 #include "json.hpp" using json nlohmann::json;#include <iostream> #include <…

基于SSM的个性化旅游攻略定制系统设计与实现(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的个性化旅游攻略定制系统设计与实现&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xf…

nosql数据库期末考试知识点总结

目录 1、什么是nosql数据库&#xff0c;它包括哪些 文档数据库 建数据 哪一种是最简单的 2、什么是文档数据库 3、创建mongodb时默认会建造三个数据库&#xff0c;是哪三个 4、mongodb支持的数据类型有哪些 5、它的常规语句有哪些 6、副本集和分片集有什么作用 复制 …

Linux中make和makefile

make与makefile 简单介绍常见用法符号替代自动寻找设置变量取消打印提示 简单介绍 make是Linux中一个命令&#xff0c;与之匹配的是makefile&#xff0c;makefile是一个文件。make会根据makefile中的内容完成对应的工作 创建一个名为makefile的文件 vim打开makefile 第一行是依…

Linux文本三剑客-awk

一、awk的介绍&#xff1a; 1.awk的简介&#xff1a; AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具 可以在无交互的模式下实现复杂的文本操作 相较于sed常作用于一整个行的处理&#xff0c;awk则比较倾向于一行当中分成数个字段来处理&#xff0c;因…

将vite项目(vue/react)使用vite-plugin-pwa配置为pwa应用,只需要3分钟即可

将项目配置为pwa模式&#xff0c;就可以在浏览器里面看到安装应用的选项&#xff0c;并且可以将web网页像app一样添加到手机桌面或者pad桌面上&#xff0c;或者是电脑桌面上&#xff0c;这样带来的体验就像真的在一个app上运行一样。为了实现这个目的&#xff0c;我们可以为vue…

openmax

通过EmptyThisBuffer传递未解码的buffer给component&#xff0c;component收到该命令后会去读取input port buffer中的数据&#xff0c;将其组装为帧之后进行解码&#xff0c;buffer处理完成后会通过EmptyBufferDone通知上层输入使用完成&#xff0c;上层收到命令可以继续送输入…

区块链游戏解说:什么是 SecondLive

数据源&#xff1a;SecondLive Dashboard 作者&#xff1a;lesleyfootprint.network 什么是 SecondLive SecondLive 是元宇宙居民的中心枢纽&#xff0c;拥有超过100 万用户的蓬勃社区。它的主要使命是促进自我表达&#xff0c;释放创造力&#xff0c;构建梦想中的平行宇宙…

Easy-Es操作Elasticsearch

文章目录 1 Easy-Es1.1 简介1.2 MySQL与Easy-Es语法对比1.3 集成及配置1.3.1 pom.xml1.3.2 配置 1.4 使用1.4.1 注解的使用1.4.2 EsMapper接口1.4.3 简单搜索 1.5 使用案例1.5.1 综合商品搜索1.5.2 相关商品推荐1.5.3 聚合搜索商品相关信息 1 Easy-Es 使用过Spring Data操作ES…

线性代数:矩阵的初等变换

目录 一、初等行变换 行阶梯 / 行最简 性质 二、矩阵的标准型 三、矩阵的等价 四、初等矩阵 五、重要性质与定理 一、初等行变换 行阶梯 / 行最简 性质 二、矩阵的标准型 三、矩阵的等价 四、初等矩阵 五、重要性质与定理

滑动窗口最终弹

力扣30.串联所有单词的子串&#xff08;巨困难&#xff09; 这个最难的是什么 1.代码的编写 2.容器的使用 class Solution {List<Integer>retnew LinkedList<>();//保存字典中所有单词的频次public List<Integer> findSubstring(String s, String[] words) …

美赛常见数据收集网站(最新、最全、全部可用+所有网站使用说明)

授人以鱼不如授人以渔&#xff0c;本次将会为大家更新如何去寻找赛中我们需要的数据集。 在数模界一直流传着一个数据库,据说报告了各种各样的数据收集网站,大家可能手里也有这样的数据库。但是这数据从2018我知道开始到现在一直没有变过。里面80%甚至90%的网站都无法使用&…

php的性能要比node.js高很多吗?

在当今的编程世界中&#xff0c;PHP和Node.js是两种广泛使用的服务器端编程语言。虽然它们都用于构建高效的网络应用程序&#xff0c;但关于它们性能的争论一直存在。有些人认为PHP的性能要比Node.js高很多&#xff0c;而另一些人则持相反意见。 性能通常指的是计算机程序或系…

人脸识别的多样化和稀疏关注对姿势变化和遮挡具有鲁棒性

DSA-Face: Diverse and Sparse Attentions for Face Recognition Robust to Pose Variation and Occlusion 一、创新点 1.提出了成对自我对比注意力来强制模型提取不同的局部特征&#xff1b; 2.设计注意力稀疏性损失是为了鼓励注意力图中的稀疏反应&#xff0c;阻止对分散注意…

【亲测有效】无法获得下列许可 SOLIDWORKS Standard 无效的(不一致的) 使用许可号码 (-8,544,0)

在观看本文章前&#xff0c;请注意看你的报错代码是否和我的一致&#xff0c;如果不是&#xff0c;直接跳过本文章。 前言&#xff1a;我安装的是SOLIDWORKS2022版&#xff0c;软件已经安装完毕&#xff0c;SolidWorks_Flexnet_Server文件夹里面的两个注册表已经安装完毕&#…

xss 盲打使用

使用beef等内网xss平台&#xff0c;或外网xss平台&#xff08;XSS平台-仅用于xss安全测试专用、XSS平台 - &#xff08;支持http/https&#xff09;XSS Platform&#xff09; 将生成的js脚本写到网站的留言框处&#xff0c;但对应的用户(尤其是admin)查看留言&#xff0c;就会…

MySQL原理(一)架构组成之逻辑模块(1)组成

总的来说&#xff0c;MySQL可以看成是二层架构&#xff0c;第一层我们通常叫做SQL Layer&#xff0c;在MySQL数据库系统处理底层数据之前的所有工作都是在这一层完成的&#xff0c;包括权限判断&#xff0c;sql解析&#xff0c;执行计划优化&#xff0c;query cache的处理等等&…

centos 7 部署若依前后端分离项目

目录 一、新建数据库 二、修改需求配置 1.修改数据库连接 2.修改Redis连接信息 3.文件路径 4.日志存储路径调整 三、编译后端项目 四、编译前端项目 1.上传项目 2.安装依赖 3.构建生产环境 五、项目部署 1.创建目录 2.后端文件上传 3. 前端文件上传 六、服务启…