python基础----09-----类、对象、魔法方法、封装、继承、类型注解、多态

news2024/11/28 22:01:26

一 初识对象

说白了就是类的实例化,类是一个抽象层的定义。
例如下面class Student就是定义的一个类,它是抽象层,然后stu_1 = Student(),我们根据类创建了一个对象,就是对类的实例化,这个实例化对象我们是可以操作的。

if __name__ == '__main__':
    # 1.设计一个类(类比生活中:设计一张登记表)
    class  Student:
        name = None        # 记录学生姓名
        gender = None        # 记录学生性别
        nationality = None        # 记录学生国籍
        native_place = None  # 记录学生籍贯
        age = None        # 记录学生年龄


    # 2.创建一个对象(类比生活中:打印- -张登记表)
    stu_1 = Student()

    # 3.对象属性进行赋值(类比生活中:填写表单)
    stu_1.name = "林军杰"
    stu_1.gender = "男"
    stu_1.nationality = "中国"
    stu_1.native_place = "山东省"
    stu_1.age = 31

    # 4.获取对象中记录的信息
    print(stu_1.name )
    print(stu_1.gender)
    print(stu_1.nationality)
    print(stu_1.native_place)

二 类的成员方法

现在我们来看看类的使用语法:

class 类名称:
	类的属性
	类的行为
  • class是关键字, 表示要定义类了。
  • 类的属性,即定义在类中的变量(成员变量)。
  • 类的行为, 即定义在类中的函数(成员方法)。
  • 创建类对象的语法对象=类名称()。

在这里插入图片描述

if __name__ == '__main__':
    # 1.设计一个类(类比生活中:设计一张登记表)
    class  Student:
        name = None        # 记录学生姓名
        def say_hi(self):
            print("he")
        def say_hi2(self,msg):
            print(f"hi,{msg}")

    # 调用方法
    s1 = Student()
    s1.say_hi()
    s1.say_hi2("wnm")
    

在这里插入图片描述

可以看到,在传入参数的时间,self是透明的,可以不用理会他。

if __name__ == '__main__':
    # 1.设计一个类(类比生活中:设计一张登记表)
    class  Student:
        name = None        # 记录学生姓名
        def say_hi(self):
            print("he",self.name)


    s1 = Student()
    s1.name = "wnm"
    s1.say_hi()#he wnm

在这里插入图片描述

三 构造方法

在这里插入图片描述

上面红色框是可以省略的,如果省略,在__init__函数中,那三行就相当于定义且赋值。而不省略,__init__函数就相当于仅赋值。

在这里插入图片描述

四 魔术方法

在这里插入图片描述

  • __init__函数:构造函数。
  • __str__函数:用于自定义打印对象。因为不定义的话,默认是打印出对象地址,而在python中地址没啥用。
  • __lt__函数:用于对象之间的小于、大于比较。
  • __le__函数:用于对象之间小于等于、大于等于的比较。
  • __eq__函数:用于对象之间是否相等的比较。

注意,上面这些魔术方法是用于自定义类时要用的,因为你自定义类,例如你要比较这个类的两个对象的大小,你不提供比较方法,python是不知道怎么比较的。

if __name__ == '__main__':
    class Student:
        # 构造函数
        def __init__(self, name, age):
            self.name = name
            self.age = age

        # __str__魔术方法
        def __str__(self):
            return f"Student类对象,name:{self.name}, age:{self.age}"

        # __lt__魔术方法.
        def __lt__(self, other):
            return self.age < other.age

        def __le__(self, other):
            return self.age <= other.age

        def __eq__(self, other):
            return self.age == other.age

    stu1 = Student("周杰轮", 3)
    stu2 = Student("周轮", 3)

    # 测试__str__魔术方法
    print(stu1)

    # 测试__lt__魔术方法
    print(stu1 < stu2)

    # 测试__le__魔术方法
    print(stu1 <= stu2)

    # 测试__eq__魔术方法
    print(stu1 == stu2)

在这里插入图片描述

五 封装

面向对象编程,是许多编程语言都支持的一种编程思想。
简单理解是:基于模板(类)去创建实体(对象) ,使用对象完成功能开发。
面向对象包含3大主要特性:
➢封装。
➢继承。
➢多态。

例如我们将成员属性和成员方法封装到类中,就是封装。继承和多态要继续看下面的内容。

私有成员的定义:

如果不在变量名或者方法名前增加2个下划线,那么就是公有的变量或者方法,对象可以直接访问公有成员,而无法访问私有成员,但私有成员可以被类内的其它成员访问。

if __name__ == '__main__':
    class Phone:
        __current_voltage = 0.5
        # 当前手机运行电压
        def __keep_single_core(self):
            print("让CPU以单核模式运行")


        # 类内的方法可以使用私有成员__current_voltage
        def call_by_5g(self):
            if self.__current_voltage >= 1:
                print("5g通话已开启")
            else:
                self.__keep_single_core()
                print("电量不足,无法使用5g通话,并已设置为单核运行进行省电。")

    phone = Phone()
    phone.call_by_5g()# 对象可以调用公有方法
    print(phone.__current_voltage)  # 报错,对象无法使用类私有成员
    phone.__current_voltage = 1 # 不报错,但相当于重新定义一个__current_voltage,与Phone内的__current_voltage不是同一个东西

在这里插入图片描述

六 继承的基础语法

6.1 单继承

语法:

class 类名(父类名):
	类内容体

例如:
在这里插入图片描述
继承之后,Phone2022同样可以使用Phone的成员和方法。

6.2 多继承

在这里插入图片描述

其中pass关键字是补全语法,表示定义一个空的。让语法补充,避免错误。当输出同名属性时,以前面为准,听父类的。

七 复写父类成员和调用父类成员

7.1 复写父类成员

什么是复写?
在这里插入图片描述

if __name__ == '__main__':
    class Phone:
        IMEI = None
        # 序列号
        producer = "ITCAST"  # 厂商
        def call_by_5g(se1f):
            print("父类的5g通话")


    class MyPhone(Phone):
        proucer = "ITHEIMA"
        # 复写父类属性
        def call_by_5g(se1f):
            # 复写父类方法
            print("子类的5g通话")

    phone = MyPhone()
    print(phone.proucer)
    phone.call_by_5g()

    '''
    ITHEIMA
    子类的5g通话
    '''

7.2 调用父类成员

调用父类的同名成员。
在这里插入图片描述

if __name__ == '__main__':
    class Phone:
        IMEI = None # 序列号
        producer = "ITCAST"  # 厂商
        def call_by_5g(se1f):
            print("父类的5g通话")


    class MyPhone(Phone):
        proucer = "ITHEIMA"
        # 复写父类属性
        def call_by_5g(se1f):
            # 调用父类方法
            # 方法1:
            print(f"父类的厂商是:{Phone.producer}")
            print("子类的5g通话")
            Phone.call_by_5g(se1f)

            # 方法2:
            print(f"父类的厂商是:{super().producer}")
            super().call_by_5g()

    phone = MyPhone()
    print(phone.proucer)
    phone.call_by_5g()

在这里插入图片描述

八 变量的类型注解

8.1 为何要类型注解

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

8.2 为变量设置类型注解

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

8.2 类型注解的限制

在这里插入图片描述

if __name__ == '__main__':
    # 基础数据类型注解
    var_1: int = 10
    var_2: str = "itheima"
    var_3: bool = True

    # 类对象类型注解
    class Student:
        pass
    stu:Student = Student()
    
    # 基础容器类型注解.
    my_list: list = [1, 2, 3]
    my_tupLe: tuple = (1, 2,3)
    my_dict: dict = {"itheima": 666}

    # 在注释中进行类型注解
    my_list = [1, 2, 3]                  # type: list
    my_tuple = ("itheima", 666, True)   # type: tuple[str, int, bool]

    # 类型注解的限制
    var_7: str = 10 #没事 但是是给自己看的

九 函数和方法类型注解

在这里插入图片描述

在这里插入图片描述

十 Union联合类型注解

在这里插入图片描述

出现混合类型时,可以通过Union联合类型添加注解。
在这里插入图片描述

十一 多态

多态:完成某个行为时,使用不同的对象会得到不同的状态。

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

FinalShell界面左侧为什么能够监测系统指标动态变化的原理

前言&#xff1a; 我们可以看出FinalShell是用Java写的&#xff0c;具体怎么看出来的&#xff0c;不能光看界面logo是Java的logo&#xff0c;还要进它的安装目录下进行查看是否真是用Java编写的&#xff01;&#xff01;&#xff01; 具体查看如下&#xff1a; 查看finalshe…

Qt+QtWebApp开发笔记(五):http服务器html中使用json触发ajax与后台交互实现数据更新传递

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/131122772 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

如何规划和执行安全测试

如何规划和执行安全测试 在现代软件开发中&#xff0c;安全测试已经成为一个必不可少的环节。在完成软件开发后&#xff0c;需要对应用程序进行安全测试&#xff0c;以确保其可以在生产环境中正常运行并能够抵御各种安全攻击和漏洞。 如何规划和执行安全测试是一个重要的问题&a…

Microsoft Excel中HYPERLINK函数的6个用途

Excel 在工具栏中提供了自己的内置链接功能。但 HYPERLINK 功能可以让你做更多的事情,比如公司内部网上的工作簿链接、共享服务器、其他驱动器,甚至 Word 文档中的书签。让我们来看看使用这个多功能功能可以做的一切。 HYPERLINK函数的6个用途 链接到电子表格中的单元格链接到…

概率论:方差、标准差、协方差、皮尔逊相关系数、线性相关

方差和标准差&#xff1a; 一个随机变量&#xff0c;的值的变化程度可以用方差计算&#xff1a; &#xff1b;其中 是期望。 我们举个例子&#xff1a; 服从均一分布&#xff0c;取值为0.1&#xff0c;0.2&#xff0c;0.3&#xff0c;0.4&#xff0c;0.5 &#xff0c;每种值…

springboot 精华

一、基础 官方文档地址&#xff1a;Spring Boot 注&#xff1a;以下部分例子 有些用到 .properties 方式&#xff0c;有些用 .yml方式&#xff0c;两者可自行学习&#xff0c;这里部分是为了省空间而写 .properties 方式。 1、泛谈 &#xff08;1&#xff09;优势 快速构建…

MyBatis Plus 拦截器实现数据权限控制(完整版)

一、说明 变化&#xff1a;相比于之前写的数据权限拦截器&#xff0c;新增了白名单功能&#xff0c;通过注解的方式让哪些SQL不进行数据权限拦截&#xff0c;之前的文章地址 思路&#xff1a;通过MyBatisPlus的拦截器对每个要执行的SQL进行拦截&#xff0c;然后判断其是否为查询…

勒索病毒远程桌面——防御方案

一、适用目标&#xff08;校园网、企业网&#xff0c;windows系列的操作系统&#xff09;&#xff1a; 所有在局域网内运行windows系统的电脑&#xff0c;并非只感染服务器操作系统&#xff0c;单机照样感染。会将你电脑中的所有文件全部加密&#xff0c;部分已感染案例有2个共…

常见的存储类型:DAS vs SAN vs NAS

什么是存储 你有想过你在朋友圈分享的照片都存在哪里&#xff1f;你在视频网站上浏览的视频都存放在哪里&#xff1f;甚至&#xff0c;你在银行卡里的存款、房贷是如何随时查询、随时存取的&#xff1f; 没错&#xff0c;这些照片、视频&#xff0c;甚至你的存款、房贷的数值…

机器学习-6 支持向量机

支持向量机 算法概述算法流程线性分类线性可分性向量内积硬间隔分类软间隔SVM模型非线性支持向量机非线性的情况非线性支持向量机核函数 SVM优点 算法步骤线性可支持向量机的程序流程图SVM算法步骤 算法实例有关数据集利用Sklearn的datasets模块生成数据集其他生成数据集的方法…

BIM与点云:一种基于航空LiDAR点云的大规模建筑重建

文章&#xff1a;City3D: Large-Scale Building Reconstruction from Airborne LiDAR Point Clouds 作者&#xff1a;Jin Huang , Jantien Stoter , Ravi Peters and Liangliang Nan 编辑&#xff1a;点云PCL 来源&#xff1a;arXiv2023 欢迎各位加入知识星球&#xff0c;获取P…

GeoServer SQL注入漏洞复现(CVE-2023-25157)

0x01 产品简介 GeoServer是一款开源的地理数据服务器软件&#xff0c;主要用于发布、共享和处理各种地理空间数据。它支持众多的地图和空间数据标准&#xff0c;能够使各种设备通过网络来浏览和使用这些地理信息数据。 0x02 漏洞概述 GeoServer在预览图层的时候&#xff0c;可…

Ubuntu20.04平台下使用二进制包部署MongoDB-6.0.4单实例

文章目录 1.1 准备服务器的基本信息1.2 操作系统上创建其用户1.3 部署MongoDB服务端1.4 部署MongoDB客户端1.5 部署MongoDB 27017实例1.5.1 创建相关目录1.5.2 准备配置文件1.5.3 准备启停脚本1.5.4 进行启停测试1.5.5 加入开机自启动 1.6 创建超级管理员用户1.6.1 创建本地的超…

do..while、while、for循环反汇编剖析

1、循环语句重要特征提取 循环语句最重要的特点就是执行的过程中会往上跳&#xff01;&#xff01;&#xff01; 箭头往上跳的一般都是循环语句&#xff0c;比如下面的for循环&#xff1a; 2、do..while语句反汇编 #include<iostream> using namespace std; #pragma …

【SpinalHDL快速入门】2、新建SpinalHDL工程,通过计数器Demo快速上手

文章目录 新建工程各个工具版本build.sbt 示例build.properties 示例如何在IEDA中更新 SpinalVersion 并 Reload sbt Project SpinalHDL入门例子&#xff1a;计数器demo1demo2&#xff08;支持reset信号异步复位&#xff0c;低电平有效&#xff09;demo3&#xff08;一个文件&a…

Flume学习--1、Flume概述、Flume入门、

1、Flume概述 1.1 Flume定义 Flume是Cloudera提供的一个高可用&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、聚合和传输的系统。Flume基于流式结构&#xff0c;灵活简单。 Flume最主要的作用就是实时读取服务器本地磁盘的数据&#xff0c;将数据写入到HDFS。 1.2…

C#winform多国语言应用实例

我们在开发项目中,一般需要软件支持多种语言,供不同客户使用。本文实例讲解实现办法。 1 窗体项目创建 添加控件MenuStrip、comboBox及Button,并修改对应显示文本,combobox编辑项输入英语 确定窗体的Localizable属性为true,自动创建Form1.resx,为False时,没有Form1.r…

基站机房:保障通信网络稳定,如何解决安全隐患?

基站机房作为无线通信网络的关键组成部分&#xff0c;承载着大量的网络设备和通信设施&#xff0c;对于运营商和通信服务提供商来说具有重要意义。 无论是大型运营商还是通信服务提供商&#xff0c;动环监控系统都将成为他们成功运营和管理通信网络的关键工具。 客户案例 案例…

vue使用高德地图--附带移动获取当前城市信息

高德地图 1.使用准备申请密钥vue使用 2.移动地图获取城市案例(注意事项)3.总结 1.使用准备 申请密钥 登录注册高德开放平台进入控制台 创建应用 申请key–生成key和安全密钥(2021之后key需要配合安全密钥使用) 注意&#xff1a;安全密钥需要在key之前 vue使用 首先在pubil…

一款功能强大的报表引擎-VeryReport报表引擎

在企业管理中&#xff0c;数据分析和决策制定是非常重要的环节。而报表则是这个过程中最常用的工具之一。但是&#xff0c;传统的报表设计与展现方式已经无法满足企业对于数据分析和报表展示的需求。为了解决这些问题&#xff0c;我们向大家推荐一款新一代Web报表软件——VeryR…