首页 > 其他分享 >面向对象(下)

面向对象(下)

时间:2024-10-31 10:15:57浏览次数:3  
标签:self list 面向对象 print 父类 data def

7.继承

继承的基础语法

学习目标:理解继承的概念,掌握继承的使用方式,掌握pass关键字的作用

就是把老的设计图继承下来,然后修修改改成为新的设计图

我们可以使用继承,来完成此需求。

单继承

从头写一个新的类:

基于原有的类进行修改:

我们可以通过继承来只关心新的功能,老的功能你压根就不需要关心,只需要通过继承的写法,全部就都过来了

单继承基础语法:

被继承的类我们把它称作父类,继承别人的我们把它称作子类,子类的功能都是从父类那里继承而来的。子类构建的类对象,可以有自己的成员变量和成员方法,使用父类的成员变量和成员方法。

继承分为单继承和多继承。

继承表示:将从父类那里继承(复制)来成员变量和成员方法(不含私有)

可以看到我在2022里面没有写原来的功能,但是我继承了原来的功能后,也可以直接使用

多继承

单继承是指一个子类继承了一个父类,多继承就表明一个子类它继承了多个父类。

pass只是一个普通的占位语句,没有实际的功能,表示无内容,空的意思,它的作用只是补全我们的语法,让计算机不报错。

多继承的注意事项:多个父类在,如果有同名的成员,那么默认以继承顺序(从左到右)为优先级。即:先继承的保留,后继承的被覆盖。

# 演示面向对象:继承的基础语法
# 演示多继承
class Phone:
    IMEI = None   # 序列号
    producer = "HM" # 厂商
    def call_by_4g(self):
        print("4g通话")
class NFCReader:
    nfc_type = "第五代"
    producer = "itcast"
    def read_card(self):
        print("NFC读卡")
    def write_card(self):
        print("NFC写卡")
class RemoteControl:
    rc_type = "红外遥控"
    def control(self):
        print("红外遥控开启了")
class MyPhone(Phone,NFCReader,RemoteControl):
    pass

phone = MyPhone()
phone.call_by_4g()
phone.read_card()
phone.write_card()
phone.control()
print(phone.producer)

谁先来的谁优先级高

复写和调用父类成员

学习目标:掌握复习父类成员的语法,掌握如何在子类中调用父类成员。

复写

对父类的成员属性或成员方法进行重新定义。

就是重新定义一下就可以了

复写的语法:在子类中重新实现同名成员方法或成员属性即可

class Phone:
    IMEI = None   # 序列号
    producer = "ITCAST"
    def call_by_5g(self):
        print("使用5g网络进行通话")
# 定义子类,复写父类成员
class MyPhone(Phone):
    producer = "itheima" # 复写父类的成员属性
    def call_by_5g(self):
        print("开启CPU单核模式,确保通话得时候省电")
        print("使用5g网络进行通话")
        print("关闭CPU单核模式,确保性能")
phone = MyPhone()
phone.call_by_5g()
print(phone.producer)

调用父类同名成员

class Phone:
    IMEI = None   # 序列号
    producer = "ITCAST"
    def call_by_5g(self):
        print("使用5g网络进行通话")
# 定义子类,复写父类成员
class MyPhone(Phone):
    producer = "itheima" # 复写父类的成员属性
    def call_by_5g(self):
        print("开启CPU单核模式,确保通话得时候省电")
        # 方式二
        print(f"父类的厂商是:{super().producer}")
        super().call_by_5g()
        print("关闭CPU单核模式,确保性能")
phone = MyPhone()
phone.call_by_5g()
print(phone.producer)

就是通过调用父类成员的形式,可以拿到被子类所复写的父类里面的内容。

注意:只可以在子类内部调用父类的同名成员,子类的实体类对象调用默认是调用子类复写的。

8.类型注解

变量的类型注解

学习目标:理解为什么使用类型注解,掌握变量的类型注解语法。

就是说:pycharm会确定这是一个什么类型,然后帮助我们推断出来里面有什么方法。

因为pycharm无法通过代码,确定应外部传入什么类型,我们需要使用类型注解。

给变量注释一个类型:

列表、集合类型设置类型详细注解,需要写列表内部是什么类型

容器类型详细注解使用[]

标记黄色下划线只是因为我们在pycharm中标记了重名变量。

这个黄色只是用来提示我们出现重名了。

alt+回车键可以自动搜索导包,帮助我们自动导包

我们可以看到注释中type:后面的int变亮了

# 演示变量的类型注解
import json
import random

# 基础数据类型注解
var_1:int = 10  # 表示var_1变量里面存储的数据是int整形
var_2:str = "itheima"
var_3:bool = True
# 类对象类型注解
class Student:
    pass
stu:Student = Student()   # 表示stu是Student这个类的类型
# 基础容器类型注解
my_list:list = [1,2,3]
my_tuple:tuple = (1,2,3)
my_dict:dict = {"itheima":666}
# 容器类型详细注解
my_list:list[int] = [1,2,3]
my_tuple:tuple[int,str,bool] = (1,"itheima",True)
my_dict:dict[str,int] = {"itheima":666}
# 在注释中进行类型注解
var_1 = random.randint(1,10)   # type:int
var_2 = json.loads('{"name":"zzzz"}')   # type:dict[str,str]
def func():
    return 10
var_3 = func()   # type:int
# 类型注解的限制
var_4:int = "ikun"
var_5:str = 123

类型注解其实仅仅只是一个备注,它压根不会影响到我们程序的运行,所以你哪怕标记错了也没有关系

总结:

函数(方法)的类型注解

学习目标:掌握为函数(方法)形参进行类型注解,掌握为函数(方法)返回值进行类型注解

这个注解都不是强制性的,只是建议性的。

总结

->  这就是一个减号和一个大于号

Union类型

学习目标:理解Union类型,掌握使用Union进行联合类型注解

使用Union[类型,......,类型]

可以定义联合类型注解

总结:

记得导包,U大写,中括号[]

9.多态

学习目标:理解多态的概念,理解抽象类(接口)的编程思想

使用同样的函数(行为),给他传入不同的对象,你就得到不同的状态了

# 演示面向对象的多态特性以及抽象类(接口)的使用


class Animal:
    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        print("汪汪汪")


class Cat(Animal):
    def speak(self):
        print("喵喵喵")
def make_noise(animal:Animal):
    # 制作点噪音,需要传入Animal对象
    animal.speak()
# 演示多态,使用2个子类对象来调用函数
dog = Dog()
cat = Cat()
make_noise(dog)
make_noise(cat)

抽象类其实就是用来做顶层设计,但是我们并不直接使用AC,也就是并不直接使用抽象类,而是使用他的具体子类

这也是强制要求我们子类必须复写父类,不然全是空,无法使用

class AC:
    def cool_wind(self):
        """制冷"""
        pass
    def hot_wind(self):
        """制热"""
        pass
    def swing_l_r(self):
        """左右摆风"""
        pass
class Midea_AC(AC):
    def cool_wind(self):
        print("美的空调制冷")
    def hot_wind(self):
        print("美的空调制热")
    def swing_l_r(self):
        print("美的空调左右摆风")
class GREE_AC(AC):
    def cool_wind(self):
        print("格力空调制冷")
    def hot_wind(self):
        print("格力空调制热")
    def swing_l_r(self):
        print("格力空调左右摆风")
def make_cool(ac:AC):
    ac.cool_wind()
midea_ac = Midea_AC()
gree_ac = GREE_AC()
make_cool(midea_ac)
make_cool(gree_ac)

我们可以实现做顶层设计也就是标准,然后由具体的类去实现,同时呢也能够完成同一种行为不同的运行状态了。

总结

(1)什么是多态?

多态指的是,同一种行为,使用不同的对象获得不同的状态。如:定义函数(方法),通过类型注解声明需要父类对象,实际传入子类对象进行工作,从而获得不同的工作状态。

(2)什么是抽象类(接口)?

包含抽象方法的类,称之为抽象类。抽象方法是指:没有具体实现的方法(pass)称之为抽象方法。

(3)抽象类的作用

多用于做顶层设计(设计标准),以便子类做具体实现。也是对子类的一种软性约束,要求子类必须复写(实现)父类的一些方法,并配合多态使用,获得不同的工作状态。

10.综合案例(数据分析的案例)

学习目标:使用面向对象思想完成数据读取和处理,基于面向对象思想重新认知第三方库使用(PyEcharts)

只需要把每一天的销售额拿过来,求个和就可以了

实现步骤: 1.设计一个类,可以完成数据的封装 2.设计一个抽象类,定义文件读取的相关功能,并使用子类实现具体功能 3.读取文件,生产数据对象 4.进行数据需求的逻辑计算(计算每一天的销售额) 5.通过PyEcharts进行图形绘制

文件读取

由于文件格式不同,我们读取它的具体实现,它的逻辑是不是也不一样,所以我们需要去构建一个抽象类,先在最顶级我们设计好读取文件应该有哪些基础功能,但我们不实现,然后我们通过具体的子类,比如说文本读取的子类或者json读取的子类,来去实现具体数据的具体读取方法

写一部分检查一下,你会发现中间空了一个,因为每一行有一个\n,你直接print这个\n就会出现换行

line = line.strip()
加入这行代码,删除\n即可

数据统计

假设有一个字典,字典里面记录的有key和value,我们的key就是日期,比如是2011年1月1日,这个key,然后记录的value,可能是它的今天的销售额,我们可以通过for循环,挨个取它里面的数据,如果取到的某一个Record里面的日期呢,是1月1号,就到字典里面看一看有没有1月1号这个key,如果有的话,就把记录的这个销售额和我当前记录的进行一个累加,然后继续for循环,出现1月1号就把它加起来,那如果我们取到的是1月2号这个key不存在,我们就给它里面再加一个新key,然后值就是你当前取到这个Record里面记录的,然后继续循环,遇到1月2号就累加......

字典的key是不会重复的,就可以判断里面有没有key,有的话就表明你已经有累加的记录了,直接把当前值给你累加上去,如果没有的话,那表明我是当前这个日期的第一条,然后把我当前的数据放进去。

统计出了每一天的销售额

可视化开发

依旧是之前构建动态柱状图的方法

if __name__ == '__main__':

这段代码意思是后面的代码只在本文件中有效,别的文件导包这个文件无效

相信大家思路都差不多了,接下来看代码!

完整代码

# 数据定义的类

class Record:   # 用来记录数据的基本信息
    def __init__(self,date,order_id,money,province):

        self.date = date     # 订单日期
        self.order_id = order_id  # 订单id
        self.money = money     # 订单金额
        self.province = province   # 销售省份
    def __str__(self):
        return f"{self.date},{self.order_id},{self.money},{self.province}"

"""
和文件相关的类定义
"""
from data_define import Record
import json
# 先定义一个抽象类用来做顶层设计,确定有哪些功能需要实现
class FileReader:
    def read_data(self) -> list[Record]:
        """读取文件的数据,读到的每一条数据都转换为Record对象,将它们都封装到list内返回即可"""
        pass
class TexFileReader(FileReader):
    def __init__(self,path):
        self.path = path   # 定义成员变量记录文件的路径
    # 复写(实现抽象方法)父类的方法
    def read_data(self) -> list[Record]:
        f = open(self.path,"r",encoding="UTF-8")
        record_list:list[Record] = []
        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
class JsonFileReader(FileReader):
    def __init__(self,path):
        self.path = path   # 定义成员变量记录文件的路径

        # 复写(实现抽象方法)父类的方法

    def read_data(self) -> list[Record]:
        f = open(self.path, "r", encoding="UTF-8")
        record_list: list[Record] = []
        for line in f.readlines():
            data_dict = json.loads(line)
            record = Record(data_dict["date"], data_dict["order_id"], data_dict["money"], data_dict["province"])
            record_list.append(record)
        f.close()
        return record_list
if __name__ == '__main__':
    text_file_reader = TexFileReader("D:/2011年1月销售数据(1)(1).txt")
    json_file_reader = JsonFileReader("D:/2011年2月销售数据JSON(2).txt")
    list1 = text_file_reader.read_data()
    list2 = json_file_reader.read_data()
    for l in list1:
        print(l)
    for h in list2:
        print(h)

# 面向对象,数据开发案例,主业务逻辑代码
"""
实现步骤:
1.设计一个类,可以完成数据的封装
2.设计一个抽象类,定义文件读取的相关功能,并使用子类实现具体功能
3.读取文件,生产数据对象
4.进行数据需求的逻辑计算(计算每一天的销售额)
5.通过PyEcharts进行图形绘制
"""
from file_define import FileReader,JsonFileReader,TexFileReader
from data_define import Record
from pyecharts.charts import Bar
from pyecharts.options import *
from pyecharts.globals import ThemeType
text_file_reader = TexFileReader("D:/2011年1月销售数据(1)(1).txt")
json_file_reader = JsonFileReader("D:/2011年2月销售数据JSON(2).txt")
jan_data:list[Record] = text_file_reader.read_data()  # 一月份数据
feb_data:list[Record] = json_file_reader.read_data()  # 二月份数据
# 将2个月份的数据合并为1个list来存储
all_data:list[Record] = jan_data + feb_data
# 开始进行数据计算
data_dict = {}
for record in all_data:
    if record.date in data_dict.keys():
        # 当前日期已经有记录了,所以和老记录做累加即可
        data_dict[record.date] += record.money
    else:
        data_dict[record.date] = record.money
# 可视化图表开发
bar = Bar(init_opts=InitOpts(theme=ThemeType.LIGHT))  # 设置主题颜色
bar.add_xaxis(list(data_dict.keys()))  # 添加x轴数据
bar.add_yaxis("销售额",list(data_dict.values()),label_opts=LabelOpts(is_show=False))   # 添加y轴数据  让数据不显示
bar.set_global_opts(
    title_opts=TitleOpts(title="每日销售额")
)
bar.render("每日销售额柱状图.html")

效果展示

标签:self,list,面向对象,print,父类,data,def
From: https://blog.csdn.net/2401_87332612/article/details/143274558

相关文章

  • 什么是多态?面向对象中对多态的理解
    本文原文来自:什么是多态?面向对象中对多态的理解什么是多态多态(Polymorphism)是面向对象编程(OOP)中的一个核心概念,它允许对象以多种形式出现。多态性使得同一个接口可以用于不同的数据类型,从而使得代码更加灵活和可扩展。简单来说,多态就是一个接口,一个类,一个抽象类,一个类里面的方......
  • 【GiraKoo】面向对象开发系列之【封装】
    【技术分享】面向对象开发系列之【封装】理解封装是面向对象程序开发的基石。程序开发,最核心价值,是数据。程序其实是读取数据,操作数据,保存数据等一系列操作。那么经过良好组织过的数据,将使编程事半功倍。高内聚,低耦合说到数据,经常挂在嘴边的,就是这句高内聚,低耦合了。这并......
  • 【GiraKoo】面向对象开发系列之【为什么要用面向对象】
    开源项目:https://girakoo.com/问答为什么要有面向对象开发?面向过程开发的C语言,往往有以下几个问题:不同的开发人员需要使用功能完全相同,或者大部分相同的函数。如果某个算法存在问题,很难保证工程里面其他位置的代码也同步获得更新。各个模块之间都是硬链接,A调用B。如果B过时......
  • 面向对象高级-final关键字
    文章目录2.1final修饰符的特点2.2补充知识:常量2.1final修饰符的特点我们先来认识一下final的特点,final关键字是最终的意思,可以修饰类、修饰方法、修饰变量。-final修饰类:该类称为最终类,特点是不能被继承-final修饰方法:该方法称之为最终方法,特点是不能被......
  • JAVA基础:面向对象 (习题笔记)
    面向对象【初】1.猫要求:使用面向对象的思想,编写自定义类描述猫通过构造函数实现对所有属性赋值吃饭的方法通过接收输入参数,描述喜欢吃的食物玩耍的方法实现根据心情的好坏,表现不同的玩耍状态,信息中包含名字,品种,颜色  的属性内容 编写测试方法,通过构造函数实例......
  • JAVA 面向对象编程
    随着软件系统的复杂性不断增加,传统的过程式编程方法已经难以满足需求。面向对象编程提供了一种更自然的方式来映射现实世界的问题域到计算机程序中,使得代码更加易于理解、维护和扩展。面向对象编程(Object-OrientedProgramming,OOP)是一种编程范式,它使用“对象”来设计软件和实......
  • Python 面向对象编程
    文章目录1.类(Class)和对象(Object)2.封装(Encapsulation)3.继承(Inheritance)4.多态(Polymorphism)5.抽象(Abstraction)面向对象编程(Object-OrientedProgramming,OOP)是Python编程中的一种范式,它允许你定义类(Class)和对象(Object),并通过这些类和对象来组织你的代码。OOP的核心......
  • 面向对象程序设计BLOG1
    前言在本次博客中,我将对题目集1~3进行总结与分析。这些题目集是基于面向对象编程(OOP)原理的实践题目,主要考察了OOP的基础知识、程序设计、输入输出处理、集合的使用、复杂对象的管理等方面的能力。这三次题目集逐步递进,从基础的类与对象的使用,到复杂的试卷管理与答题系统设计,最终......
  • JAVA学习笔记--面向对象_面向对象思想介绍
    面向对象的介绍 1.面向过程:自己的事情自己干,代表语言C语言     洗衣服:每一步自己要亲力亲为->找个盆,放点水,找个搓衣板,搓搓搓2.面向对象:自己的事情别人帮忙去干,代表语言Java语言       洗衣服:自己的事情别人干->全自动洗衣机如果......
  • 面向对象高级-static
    文章目录1.1static修饰成员变量1.2static修饰成员变量的应用场景1.3static修饰成员方法1.4工具类来看static的应用1.5static的注意事项1.6static应用(代码块)1.7static应用(单例设计模式)static读作静态,可以用来修饰成员变量,也能修饰成员方法。1.1st......