python基础----09-----类、对象、魔法方法、封装、继承、类型注解、多态、数据分析案例

news2025/1/15 20:51:25

一 初识对象

说白了就是类的实例化,类是一个抽象层的定义。
例如下面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联合类型添加注解。
在这里插入图片描述

十一 多态

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

在这里插入图片描述

在这里插入图片描述

十二 数据分析案例

数据内容,可以找我要。

在这里插入图片描述

在这里插入图片描述

data_define.py:

class Record:
    #定义4个成员变量,因为两个数据txt都是四列数据
    def __init__(self,data,order_id,money,provine):
        self.date = data  #订单日期
        self.order_id = order_id#订单ID
        self.money = money#订单金额
        self.provine = provine#订单省份
    def __str__(self):
        return (f"{self.date},{self.order_id},{self.money},{self.provine}")

file_define.py:

import json

from data_define import Record

# 文件父类
class FileReader:
    def read_data(self) :
        pass

# 读取文本文件
class TextFileReader(FileReader):
    def __init__(self,path):
        self.path = path

    # 从文件读取数据,并封装成Record列表返回
    def read_data(self):
        f = open(self.path,"r",encoding="UTF-8")
        record_list = []
        for line in f.readlines():
            line = line.strip() # 去掉\n
            data_list = line.split(",")
            record = Record(data_list[0], data_list[1], int(data_list[2]), data_list[3])
            record_list.append(record)
        f.close()
        return record_list # list[Record]

# 读取json文件
class JsonFileReader(FileReader):
    def __init__(self,path):
        self.path = path

    # 从文件读取数据,并封装成Record列表返回
    def read_data(self):
        f = open(self.path, "r", encoding="UTF-8")
        record_list = []
        for line in f.readlines():
            data_dict = json.loads(line)
            record = Record(data_dict["date"], data_dict["order_id"], int(data_dict["money"]), data_dict["province"])
            record_list.append(record) # list[Record]
        f.close()
        return record_list



if __name__ == '__main__':
     text_file_reader = TextFileReader("C:/Users/Administrator/Desktop/Py/第13章资料/2011年1月销售数据.txt")
     json_file_reader = JsonFileReader("C:/Users/Administrator/Desktop/Py/第13章资料/2011年2月销售数据JSON.txt")
     list1 = text_file_reader.read_data()
     list2 = json_file_reader.read_data()

     for l in list1:
         print(l)
     for l in list2:
         print(l)

main.py:

from file_define import FileReader,TextFileReader,JsonFileReader
from data_define import Record
from pyecharts.charts import Bar
from pyecharts.globals import ThemeType
from pyecharts.options import TitleOpts
from pyecharts.options import LabelOpts
from pyecharts.options import InitOpts

# 1. 定义两个对象
text_file_reader = TextFileReader("C:/Users/Administrator/Desktop/Py/第13章资料/2011年1月销售数据.txt")
json_file_reader = JsonFileReader("C:/Users/Administrator/Desktop/Py/第13章资料/2011年2月销售数据JSON.txt")

# 2. 读取数据
jan_data = text_file_reader.read_data() #list[Record]
feb_data = json_file_reader.read_data()#list[Record]

# 3. 合并1月和2月的数据
all_data = jan_data + feb_data #list[Record]

# 4. 封装字典.key=日期, value=销售额
data_dict = {}
for record in all_data:
    # 日期作为key,若key存在,则累加; 不存在则插入第一条
    if record.date in data_dict.keys():
        # 当前日期已经有记录了,所以和老记录做累加即可
        data_dict[record.date] += record.money
    else:
        data_dict[record.date] = record.money
#print(data_dict)

# 5. 定义柱状图对象
bar = Bar(init_opts=InitOpts(theme=ThemeType.LIGHT))

# 6. 添加x轴,y轴
# label_opts=LabelOpts(is_show=False)是去掉多余的数字
bar.add_xaxis(list(data_dict.keys()))
bar.add_yaxis("销售额", list(data_dict.values()), label_opts=LabelOpts(is_show=False))

# 7. 设置全局选项
bar.set_global_opts(
    title_opts=TitleOpts(title="每日销售额")
)

# 8. 生成html
bar.render("每日销售额柱状图.html")

结果:

在这里插入图片描述

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

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

相关文章

paas云底座-数字化转型,你真的了解么

云底座是什么&#xff1f; 如图 底座其实就是一个基础打个比方&#xff1a; 把底座看成一块土地&#xff0c;我们在这块土地上可以盖楼房&#xff0c;可以挖一个游泳池&#xff0c;可以开一家饭店 也就是说我们这块土地可以开发很多东西言归正传 云底座其实就是数字化转型的“底…

【快速幂】-迭代法:详解

何为快速幂&#xff1f; 我们经常会计算&#xff1a;。STL中有自带的pow函数&#xff0c;如果当n很大的时候&#xff0c;那么一定会TLE。 因此&#xff0c;我们需要另一种求值的方法&#xff1a;快速幂&#xff01; 快速幂有两种做法&#xff1a;1&#xff1a;递归 2…

谷歌云 | 宣布跨云互连:无缝连接到您的所有云

【本文由Cloud Ace整理发布&#xff0c;Cloud Ace 是谷歌云全球战略合作伙伴&#xff0c;拥有 300 多名工程师&#xff0c;也是谷歌最高级别合作伙伴&#xff0c;多次获得 Google Cloud 合作伙伴奖。作为谷歌托管服务商&#xff0c;我们提供谷歌云、谷歌地图、谷歌办公套件、谷…

1 软件测试基本概念

文章目录 课程目标1. 入门前的7个基础问题2. 软件测试基本概念2.1 需求的概念2.1.1需求的基本概念2.1.2 从软件测试人员角度看需求2.1.3 为什么需求对软件测试人员如此重要&#xff1f;2.1.4 如何才可以深入理解被测试软件的需求 2.2 bug的概念(了解)2.3测试用例的概念2.3.1 概…

AI读心术

近期&#xff0c;德克萨斯大学奥斯汀分校的神经科学家们展开了一场「AI」实验&#xff0c;利用人工智能聊天机器人ChatGPT&#xff0c;将大脑活动转化为文字信息。 参与实验的志愿者&#xff0c;在进行长达20小时的「训练」后&#xff0c;成功被「AI」识别出正在进行的活动。按…

portraiture宿主插件最新v4中文版本下载及使用教程

自拍怎么可以不修图呢&#xff1f;如果要修图的话&#xff0c;磨皮就是其中非常重要的一环。皮肤看起来细腻光滑了&#xff0c;整个人的颜值都会瞬间拉高。下面就让我们介绍一下磨皮用什么软件好用&#xff0c;什么软件可以手动磨皮的相关内容。portraiture是ps人像修图中常用的…

喜报!恭喜知了堂学员成功通过CISP-PTE证书考试

有人说&#xff0c;大学可以不谈恋爱&#xff0c;但一定要考证。 考证&#xff0c;是大学校园生活的关键一环。充分利用在校时间为后期就业提前储备优势&#xff0c;毕业后如果从事IT领域&#xff0c;证书就是一个高含金量的专业认证&#xff0c;尤其是网络安全行业&#xff0…

干货|SpringBoot-Maven与Gradle多模块搭建

比较熟悉的模式是SpringbootMaven多模块的组织方式&#xff0c;由于近期Gradle势力很猛&#xff0c;据Gradle官网给出的5种压测场景的数据来看&#xff0c;Gradle的处理性能确实比Maven快&#xff0c;所以就来体验一下Gradle怎么做多模块搭建和各种依赖的引入和查看。 对Gradl…

【unity】燧光MR设备接入极简教程

官网说明文档&#xff1a; https://doc.ximmerse.com/sdkconf/unityxrsdk/index.html 一、环境准备 1、Unity环境准备 配置adb环境 官网下载&#xff1a;https://developer.android.google.cn/studio/releases/platform-tools 找到SDK Platform-Tools下载 参照 此教程 配置ad…

vulnhub dc-9

1.信息搜集 端口 80 20 filter 存活ip 172.16.1.65 2.访问网站进行信息搜集 cms staff 寻找漏洞 登录处尝试弱口令失败&#xff0c;尝试sql失败 search处sql注入 3.sqlmap跑用户名和密码 注意这题两个库的用户名和密码都需要 UserDetails&#xff0c;Users search处是post传参&…

trace clock structure的若干方法

这里分享几个trace clock structure的方法,各有特点。 1)report_clock_qor -to FF/CK -clock $clk_name -type structure 报告的结果与innovus的clock structure报告类似,如下示例。 (H) clock_root_name # sdc中的root name (0) cts_buf: A-> Y [REF: XX/BUF_XX] [Lo…

【Android开发基础】说说模块设计(下拉刷新、图片查看、布局设计)

文章目录 一、引言二、设计1、下拉刷新&#xff08;1&#xff09;依赖&#xff08;2&#xff09;使用 2、图片需求 三、结论 一、引言 描述&#xff1a;设计一个简单说说功能模块需求&#xff1a; 1、能够下拉刷新&#xff0c;更新数据 2、一条说说里允许包含多张图片&#xf…

第七章 Electron Vue3实现音乐播放器

一、介绍 &#x1f351; &#x1f351; &#x1f351; 一个音乐播放器应该具备播放、暂停、上一首、下一首、播放模式&#xff08;单曲循环、列表循环、顺序播放……&#xff09;。除了这些比如还可以扩展进度条的展示、拖拽、音量大小的调节&#xff0c;如果资源允许的话可以…

跨境电商开发的基本流程

在全球化的浪潮下&#xff0c;跨境电商已成为一个热门的商业模式。然而&#xff0c;很多人在跨境电商开发的过程中遇到了许多问题。本文将介绍跨境电商开发的流程&#xff0c;希望能够帮助大家更好地了解这个行业。 首先&#xff0c;跨境电商开发的第一步是寻找合适的产品。这…

DOC文件丢失怎么恢复?用这7种方法找回

在日常生活和工作中&#xff0c;我们经常会因为各种原因丢失重要的DOC文件&#xff0c;这给我们带来了不小的困扰。但是&#xff0c;不必担心&#xff0c;在本文中&#xff0c;我们将带大家了解一下DOC文件丢失怎么恢复。 关于DOC文件 DOC文件是指一种微软公司开发的文字处理软…

【短视频抖音多账号管理系统源码开发路径】

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 短视频矩阵系统开发涉及到多个领域的技术&#xff0c;包括视频编解码技术、大数据处理技术、音视频传输技术、电子商务及支付技术等。因此&#xff0c;短视频矩阵系统开发人员需要具备扎实的计算机基础知识、出色的编…

多边形三角化Earcut分析,以mapbox EarCut源码举例

多边形三角化&#xff0c;简单来说&#xff0c;就是给定一圈有序的多边形点生成三角面片&#xff0c;EarCut的原理描述网络上有很多&#xff08;如https://blog.csdn.net/qq_24459491/article/details/102976671&#xff09;&#xff0c;就不细说了。但是有的时候看是一回事&am…

Ae 效果详解:Mocha AE

Ae菜单&#xff1a;效果/Boris FX Mocha/Mocha AE Effects/Boris FX Mocha/Mocha AE Ae菜单&#xff1a;动画/Track in Boris FX Mocha Animation/Track in Boris FX Mocha Mocha Pro 是一款强大的平面跟踪软件。既可作为独立软件运行&#xff0c;也提供了 Ae 的插件版本&#…

1.4C++运算符重载作函数

C运算符重载函数作为类成员函数 作为类成员函数时&#xff0c;运算符重载函数使用类的成员变量作为操作数。 写个 demo&#xff1a; 运算符重载函数作为类成员函数时&#xff0c;需要注意&#xff1a;运算符重载函数必须是类的成员函数&#xff0c;不能是普通函数或者全局函…

MIT6.024学习笔记(二)——图论(1)

学习不是为了竞争和战胜他人&#xff0c;而是为了更好地了解自己和世界。 - 达赖喇嘛 文章目录 图的相关概念涂色问题基础涂色方法&#xff08;贪婪算法&#xff09;证明 二分图匹配问题应用&#xff1a;稳定婚烟问题算法性质及其证明 图的相关概念 图的定义&#xff1a;一组&…