Python-面向对象

面向对象

  • 1.初识对象
    • 1.1理解使用对象完成数据组织的思路
  • 2.成员方法
    • 2.1类的定义和使用语法
    • 2.2成员方法的使用
  • 3.类和对象
  • 4.构造方法
    • 4.1使用构造方法向成员变量赋值
  • 5.其他内置方法
    • 5.1__str__字符串方法
    • 5.2__lt__小于符号比较方法
    • 5.3__le__小于等于比较符号
    • 5.4__eq__比较运算符实现方法
  • 6.封装
    • 6.1封装的概念
    • 6.2私有成员的使用
  • 7.继承
    • 7.1继承的概念
    • 7.2复写和使用父类成员
  • 8.类型注解
    • 8.1变量的类型注解
    • 8.2函数(方法)的类型注解
    • 8.3 Union类型
  • 9.多态
  • 10.综合案例

1.初识对象

1.1理解使用对象完成数据组织的思路

思考🤔?
学校开学,要求学生填写自己的基础信息,一人发一张白纸,让学生填写
在这里插入图片描述
改为使用登记表,打印出来让学生自行填写:
在这里插入图片描述
在程序中简单使用变量来记录学生信息
在这里插入图片描述
使用变量记录数据太乱了。
如果程序中也和生活中一样

  • 可以设计表格
  • 可以将设计的表格打印出来
  • 可以将打印好的表格供人填写内容
    那么数据的组织就非常方便了。

使用对象组织数据
在程序中可以做到和生活中那这样,设计表格,生产表格和填写表格的组织形式的
1.在程序中设计表格,我们称之为:设计类(class)

class Studen:
      name = None   #记录学生姓名

2.在程序中打印生产表格,我们称之为:创建对象

# 基于类创建对象
stu1 = Student()
stu2 = Student()

3.在程序中填写表格,我们称之为:对象属性赋值

stu_1.name = "周杰轮"  # 为学生1对象赋予名称属性值
stu_2.name = "林军杰"  # 为学生2对象赋予名称属性值

2.成员方法

2.1类的定义和使用语法

class 类名称 class是关键字,表示要定义类了
类的属性 类的属性,即定义在类中的变量(成员变量)
类的行为 类的行为,即定义在类中的函数(成员方法)

创建类对象的语法
对象 = 类名称()
在这里插入图片描述

class Student:
      name = None # 学生的姓名
      age = None # 学生的年龄
      def say_hi(self):
     	  print(f"Hi大家好,我是{self.name}")
stu = Student()
stu.name = "周杰轮"
stu.say_hi()   # 输出: Hi大家好,我是周杰轮

从上述代码中可以得出

  • 不仅可以定义属性来记录数据
  • 也可以定义函数,用来记录行为
  • 类中定义的属性(变量),我们称之为:成员变量
  • 类中定义的行为(函数),我们称之为:成员方法

定义在类内部的函数称之为方法

2.2成员方法的使用

在类中定义成员方法和定义函数基本一致,但仍有细微的区别:

def 方法名(self,形参1 ....,形参N):
    方法体

可以得出,在方法定义的参数列表中,有一个:self关键字self关键字是成员方法定义的时候,必须填写的。

  • 它用来表示类对象自身的意思
  • 当我们使用类对象调用方法的是,self会自动被Python传入
  • 在方法内部,想要访问类的成员变量,必须使用self

注意事项
self关键字,尽管在参数列表中,但是传参的时候可以忽略它

class Student:
    name = None

    def say_hi(self):
        print(f"Hello,大家好")
    def say_hi2(self,msg):
        print(f"大家好!{msg}")
stu = Student()
stu.say_hi()  # 调用的时候,无需传参
stu.say_hi2("很高兴认识大家")  # 调用的时候,需要传msg参数

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

3.类和对象

现实世界的事务和类
在这里插入图片描述
类和对象描述现实事务
在这里插入图片描述
程序中通过类来描述
在这里插入图片描述
基于类创建对象
在这里插入图片描述

4.构造方法

4.1使用构造方法向成员变量赋值

class Student:
      name = None  # 名称
      age = None   # 年龄
      tel = None   # 手机号
stu1 = Student()
stu1.name = "周杰轮"
stu1.age = 31
stu1.tel = "18012340000"

stu2 = Student()
stu2.name = "周杰轮"
stu2.age = 31
stu2.tel = "18012340000"

思考🤔
上述代码中,为对象的属性赋值需要依次进行,略显繁琐。
有没有更加高的方式,一行代码完成?
这个括号,能否像函数(方法)那样,通过传参的形式对属性赋值?
使用构造方法: __init__()

  • 在创建类对象(构造类)的时候,会自动执行
  • 在创建类对象(构造类)的时候,将传入参数自动传递给__init__方法使用
class Student:
      name = None  # 可以省略
      age = None   # 可以省略
      tel = None   # 可以省略
      def __init__(self,name,age,tel)
      	  self.name = name
      	  self.age = age
      	  self.tel = tel
      	  print("Student类创建了一个对象")
stu = Student("周杰轮",31,"18500000000")

构造方法注意事项

  • 构造方法名称:init_,千万不要忘记init前后有两个下划线
  • 构造方法也是成员方法,不要忘记在参数列表中提供:self
  • 在构造方法内定义成员变量,需要使用self关键字
    • 这是因为:变量是定义在构造方法内部,如果要成为成员变量,需要用self来表示
      练习
      在这里插入图片描述
class Student:
    # 构造方法
    def __init__(self):
        self.name = input("请输入学生姓名:")
        self.age = int(input("请输入学生年龄:"))
        self.address = input("请输入学生地址:")

for i in range(1, 11):
    print(f"当前录入第{i}位学习信息,总共需录入10位学习信息")
    stu = Student()
    print(f"学生{i}信息录入完成,信息为:【学生姓名:{stu.name}, 年龄:{stu.age}, 地址:{stu.address}")

5.其他内置方法

5.1__str__字符串方法

class Student:
    def __init__(self,name,age):
        self.name = name
        self.age =  age
stu = Student("周杰伦",25)
print(stu)
print(str(stu))
# 输出
<__main__.Student object at 0x000001E952802150>
<__main__.Student object at 0x000001E952802150>

当类对象需要被转换为字符串时,会输出如上结果(内存地址)
内存地址没多大用,我们可以通过__str__方法,控制类转换为字符串的行为。

class Student:
    def __init__(self,name,age):
        self.name = name
        self.age =  age
    def __str__(self):
        return f"Student类对象,name={self.name},age={self.age}"

stu = Student("周杰伦",25)
print(stu)
print(str(stu))
# 输出
Student类对象,name=周杰伦,age=25
Student类对象,name=周杰伦,age=25

5.2__lt__小于符号比较方法

class Student:
    def __init__(self,name,age):
        self.name = name
        self.age =  age
stu1 = Student("周杰伦",25)
stu2 = Student("林俊杰",30)
print(stu1 < stu2)

直接两个对象比较是不可以的,但是在类中实现__lt__方法,即可同时完成:小于符号和大于符号 两种比较

class Student:
    def __init__(self,name,age):
        self.name = name
        self.age =  age
    def __lt__(self, other):
        return self.age < other.age
stu1 = Student("周杰伦",25)
stu2 = Student("林俊杰",30)
print(stu1 < stu2)
# 返回值 True或者False

5.3__le__小于等于比较符号

class Student:
    def __init__(self,name,age):
        self.name = name
        self.age =  age
    def __le__(self, other):
        return self.age <= other.age
stu1 = Student("周杰伦",25)
stu2 = Student("林俊杰",30)
print(stu1 <= stu2) # 结果 True
print(stu1 >= stu2) # 结果 False

5.4__eq__比较运算符实现方法

class Student:
    def __init__(self,name,age):
        self.name = name
        self.age =  age
    def __eq__(self, other):
        return self.age == other.age
stu1 = Student("周杰伦",25)
stu2 = Student("林俊杰",30)
print(stu1 == stu2)
  • 不实现__eq__方法,对象之间可以比较,但是是比较内存地址,也即是:不同对象==比较一定是False结果
  • 实现了__eq__方法,就可以按照自己的想法来决定2个对象是否相等了

6.封装

6.1封装的概念

封装表示的是,将现实世界事物的

  • 属性
  • 行为

封装到类中,描述为

  • 成员变量
  • 成员方法

从而完成程序对现实世界事物的描述
在这里插入图片描述

6.2私有成员的使用

在这里插入图片描述
私有成员的语法

  • 私有成员的变量:变量名以__开头(2个下划线)
  • 私有成员的方法:方法名以__开头(2个下划线)
class Phone:
    IMEI = None  # 序列号
    producer = None  # 厂商
    __current_voltage = 0.5  # 当前电压  私有成员变量
    def call_by_5g(self):
        print("5g通话已开启")
    def __keep_single_core(self):  # 私有成员方法
        print("让cpu以单核模式运行以节省电量")
phone = Phone()
phone.call_by_5g()

注意事项

  • 私有方法无法直接被类对象使用
  • 私有变量无法赋值,也无法获取值

使用私有成员
私有成员无法被类对象使用,但是可以被其他的成员使用

class Phone:
    IMEI = None  # 序列号
    producer = None  # 厂商
    __current_voltage = 1  # 当前电压  私有成员变量
    def call_by_5g(self):
        if  self.__current_voltage >= 1:
            self.__keep_single_core()
            print("5g通话已开启")
    def __keep_single_core(self):  # 私有成员方法
        print("让cpu以单核模式运行以节省电量")
phone = Phone()
phone.call_by_5g()
# 输出
让cpu以单核模式运行以节省电量
5g通话已开启

练习
在这里插入图片描述

class Phone:
    __is_5g_enable = False  # True表示5g开启,False表示5g关闭
    def __check_5g(self):
        if self.__is_5g_enable ==True:
            print("5g开启")
        else:
            print("5g关闭,使用4g网络")
    def call_by_5g(self):
        self.__check_5g()
        print("正在通话中")
phone = Phone()
phone.call_by_5g()
# 输出
5g关闭,使用4g网络
正在通话中

7.继承

7.1继承的概念

在这里插入图片描述
思考🤔?
如果你是设计师,你会如何选择?
1.每一代新款手机,都从零开始设计
2.基于老款的设计,修修改改
设计新手机基于老款的基础上进行修改

class Phone:
    IMEI = None
    producer = "ITCAST"
    def call_by_4g(self):
        print("4g通话")

class Phone2024(Phone):
    face_id = '10001'

    def call_by_5G(self):
        print("2024新功能:5g通话")

单继承
语法:

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

多继承
在这里插入图片描述

语法:

class 类名(父类1,父类2...父类3)
      类内容体
class Phone:
    IMEI = None
    producer = "ITCAST"
    def call_by_4g(self):
        print("4g通话")
class NFCReader:
    nfc_type = "第五代"
    producer = "HM"
    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()
print(phone.producer)
phone.call_by_4g()
phone.read_card()
# 输出
ITCAST
4g通话
NFC读卡
父类的品牌是ITCAST
父类的5g通话
ITCAST

7.2复写和使用父类成员

复写
子类继承父类成员属性和成员方法,如果对其“不满意”,那么可以进行复写。
即:在子类重新定义同名的属性或方法即可。

class Phone:
    IMEI = None
    producer = "ITCAST"
    def call_by_5g(self):
        print("父类的5g通话")
class Myphone(Phone):
    producer = "HM"
    def call_by_5g(self):
        print("子类的5g通话")


phone = Myphone()
print(phone.producer)
phone.call_by_5g()
# 输出
HM
子类的5g通话

调用父类成员

class Phone:
    IMEI = None
    producer = "ITCAST"
    def call_by_5g(self):
        print("父类的5g通话")
class Myphone(Phone):
    producer = "HM"
    def call_by_5g(self):
        # 方式1 调用父成员
        print(f"父类的品牌是{Phone.producer}")
        Phone.call_by_5g(self)
        # 方式2 调用父类成员
        print(f"父类的品牌是{super().producer}")
        super().call_by_5g()
        print("子类的5g通话")

注意事项
方式1调用父类成员

  • 使用成员变量:父类名.成员变量
  • 使用成员方法:父类名.成员方法(self)

方式2调用父类成员

  • 使用成员变量:super().成员变量
  • 使用成员方法:super().成员方法()

8.类型注解

8.1变量的类型注解

主要功能:

  • 帮助第三方IDE工具(如PyCharm)对代码进行类型推断,协助做代码提示
  • 帮助开发者自身对变量进行类型注释

支持:

  • 变量的类型注解
  • 函数(方法)形参列表和返回值的类型注解

方法1

# 基础容器类型注解
my_list :list = [1,2,3]
my_tuple: tuple = (1,2,3)
mu_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}
# 类对象类型注解
class Student:
      pass
stu: Student = Student()

方法2

# 在注释中进行类型注解
var_1 = random.randint(1,10) # type: int
var_2 = json.loads('{"name":"zhangsan"}') # type: dict[str,str]
def func():
    return 10
var_3 = func() # type: int 

注意:类型注解只是提示性的,并非决定性的。数据类型和注解类型无法对应也不会导致错误

8.2函数(方法)的类型注解

形参注解

def add(x:int,y:int):
    return x + y
add()

返回值注解

def func(data: list) -> list:
    return data
print(func())

8.3 Union类型

在这里插入图片描述

from typing import Union
my_list: list [Union[int,str]] = [1,2,"heima"]
def func(data: Union[int,str]) ->Union[int,str]:
    pass

9.多态

多态:指的是多种状态。完成某个行为是,使用不同的对象会得到不同的状态。
在这里插入图片描述
多态常作用在继承关系上.

比如

  • 函数(方法)形参声明接收父类对象
  • 实际传入父类的子类对象进行工作

即:

  • 以父类做定义声明
  • 以子类做实际工作
  • 用以获得同一行为, 不同状态

抽象类(接口)
在这里插入图片描述
举例

class  AC:
    def cool_wind(self):
        """制冷"""
        pass
    def hot_wind(self):
        """制热"""
        pass
    def wring_l_r(self):
        """左右摆风"""
        pass
class Midea_AC(AC):
    def cool_wind(self):
        print("美的空调核心制冷科技")
    def hot_wind(self):
        print("美的空调电热丝加热")
    def wring_l_r(self):
        print("美的空调无风感左右摆风")
class GREE_AC(AC):
    def cool_wind(self):
        print("格力空调变频省电制冷")
    def hot_wind(self):
        print("格力空调电热丝加热")
    def wring_l_r(self):
        print("格力空调静音左右摆风")

def make_cool(ac:AC):
    ac.cool_wind()

midea = Midea_AC()
gree = GREE_AC()

make_cool(midea)
make_cool(gree)

# 输出
美的空调核心制冷科技
格力空调变频省电制冷

10.综合案例

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

import json   # 导入json模块
from pyecharts.charts import Bar   # 导入pyecharts相关的模块
from pyecharts.options import *
from pyecharts.globals import ThemeType
class Record:   # 数据定义的类
    def __init__(self,date,order_id,money,province):  # 该四个变量,在创建类对象时,需要将变量写入
        self.date = date
        self.order_id = order_id
        self.money = money
        self.province = province

    def __str__(self):    # 魔法方法,控制类转换为字符串(原输出为内存地址)
        return f"{self.date},{self.order_id},{self.money},{self.province}"

# 定义一个抽象类用来做顶层设计,确定有哪些功能来实现
class FileReader:
    def read_data(self) ->list[Record]:
        # 读取文件的数据,读到的每一条数据都转换为Record对象,将他们封装到list内
        pass

class TextFileReader(FileReader):
    def __init__(self,path):  # 定义成员变量的路径
        self.path = path

    # 复写父类的方法
    def read_data(self) ->list[Record]:
        record_list = []
        f = open(self.path,"r",encoding="UTF-8")
        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 = []
        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)
        f.close()
        return record_list

text_file_reader = TextFileReader("D:/2011年1月销售数据.txt")
json_file_reader = JsonFileReader("D:/2011年2月销售数据JSON.txt")
jan_data: list[Record]=  text_file_reader.read_data()
feb_data: list[Record] = json_file_reader.read_data()
# 将两个月的数据转换为1个list来存储
all_data: list[Record] = jan_data + feb_data

# 开始进行数据计算,通过字典的方式
# {"2011-01-01":1534,"2011-01-02":300,"2011-01-03":500}
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")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快快销ShopMatrix 分销商城多端uniapp可编译5端 - 佣金倍数提现

本文来自应用中心-9999款应用在线选购 "佣金倍数提现"这个概念在不同的上下文中可能有不同的含义&#xff0c;但通常它涉及到基于用户赚取的佣金来设定提现条件。这是一种常见的机制&#xff0c;尤其是在那些提供佣金或回扣的平台上&#xff0c;如联盟营销、金融交易…

网络安全工程师必备证书有哪些?

&#x1f4d5;网络环境之间的竞争&#xff0c;归根到底优秀人才之间的竞争。网络安全工程师必备证书有哪些? 1️⃣NISP国家信息安全资格证书 NISP被称称作“校园版CISP”&#xff0c;获得了网络空间安全领域广泛承认的行业认证&#xff0c;是信息安全专业的必考资格证书&#…

云原生分布式多模架构:华为云多模数据库 GeminiDB 架构与应用实践

文章目录 前言一、GeminiDB 总体介绍1.1、华为云数据库全景图1.2、GeminiDB 发展历程1.3、GeminiDB 全球分布情况 二、GeminiDB 云原生架构2.1、核心设计&#xff1a;存算分离&多模扩展2.2、存算分离&多模扩展核心优势2.3、高可用&#xff1a;秒级故障接管2.4、弹性扩展…

Manjora 中使用idm,linux通用

说明 在Mnajora中的idm需要在wine中运行&#xff0c;idm是一款很不错的下载工具&#xff0c;但是在linux不能直接使用&#xff0c;借助wine也无法使用浏览器的集成插件&#xff0c;在网上偶然发现一款第三方插件能够在linux的浏览器中将链接捕捉到idm中&#xff0c;虽然使用起…

前端动画特效分享(附在线预览)

分享几款不错的动画特效源码 其中有CSS动画、canvas动画、js小游戏等等 下面我会给出特效样式图或演示效果图 但你也可以点击在线预览查看源码的最终展示效果及下载源码资源 canvas爱心代码动画 爱心代码动画特效 由里向外不断的产生的小爱心形成一个巨大的爱心动画 以下图片…

Linux应用层调用驱动层

1.Linux如何与驱动层通信 在Linux操作系统中&#xff0c;为了确保系统的安全性和稳定性&#xff0c;应用程序通常不被允许直接访问驱动层。相反&#xff0c;应用程序需要通过操作系统提供的接口来与驱动程序进行通信。这种通信通常是通过系统调用完成的。 系统调用是应用程序…

3.3.2 CSMA/ CD协议

3.3.2 CSMA/ CD协议 CSMA/CD&#xff08;Carrier Sense Multiple Access with Collision Detection&#xff09;&#xff1a;载波监听多点接入/碰撞检测。 检测到碰撞后&#xff1a; 适配器立即停止发送。&#xff08;碰撞点后面的信号会一直叠加&#xff09;等待一段随机时间…

超强文档搜索引擎AnyTXT Searcher本地搭建

文章目录 前言1. AnyTXT Searcher1.1 下载安装AnyTXT Searcher 2. 下载安装注册cpolar3. AnyTXT Searcher设置和操作3.1 AnyTXT结合cpolar—公网访问搜索神器3.2 公网访问测试 4. 固定连接公网地址 前言 你是否遇到过这种情况&#xff0c;异地办公或者不在公司&#xff0c;想找…

(更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)

A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数&#xff08;2009-2023年&#xff09;参考《经济研究》中方先明&#xff08;2023&#xff09;的做法&#xff0c;将华证ESG评级进行赋值&#xff0c;指标包含C、CC、CCC、B、BB、BBB、A、AA、AAA共9个等级&#xff0c;…

【Redis配置】Linux下的Redis安装配置

压缩包方式的Redis下载与安装 进入官网 Redis官网&#xff1a;https://redis.io/download/ 往下翻可以找到其他版本的Redis&#xff0c;或者访问https://download.redis.io/releases/查找自己所需Redis版本。 下载自己所需版本 此处我选择下载的是6.2.14版本 上传到Linux…

【java八股文】之计算机网络系列篇

1、TCP/IP和UDP模型 TCP/IP分层&#xff08;4层&#xff09;&#xff1a;应用层&#xff0c;传输层&#xff0c;网络层&#xff0c;数据链路层 网络的七层架构 &#xff08;7层&#xff09;&#xff1a;应用层&#xff0c;表示层&#xff0c;会话层&#xff0c;传输层&#xff…

第15届蓝桥STEMA测评真题剖析-2023年12月17日Scratch编程初中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第166讲。 第15届蓝桥第3次STEMA测评&#xff0c;这是2023年12月17日举办的STEMA&#xff0c;比赛仍然采取线上形式。这…

【Java】Ruoyi-Vue-Plus 整合 jasypt 为SpringBoot配置文件进行加密

开发环境 Ruoyi-Vue-Plus 5.1.2&#xff08;Spring Boot 3.1.7&#xff09;jasypt 3.0.5 进入依赖 项目的根pom.xml 项目的根 pom.xml 文件中&#xff0c;添加同一版本管理 <properties><!--配置文件参数加密--><jasypt.version>3.0.5</jasypt.version…

MAX-4/11/03/032/99/1/1/00智能伺服驱动器ELAU

MAX-4/11/03/032/99/1/1/00智能伺服驱动器ELAU MAX-4/11/03/032/99/1/1/00智能伺服驱动器ELAU A-B 1394-SJT05-C A-B 1326AS-B440G-21-A A-B 6186M-17PT ELAU MAX-4/11/03/032/99/1/1/00 ELAU MAX-4/11/03/032/08/1/1/00 ELAU MAX-4/11/03/016/99/1/1/00 E…

外观模式介绍

目录 一、外观模式介绍 1.1 外观模式定义 1.2 外观模式原理 1.2.1 外观模式类图 1.2.2 模式角色说明 1.2.3 示例代码 二、外观模式的应用 2.1 需求说明 2.2 需求实现 2.2.1 类图 2.2.2 具体实现 2.2.2.1 灯光类 2.2.2.2 电视类 2.2.2.3 空调类 2.2.2.4 外观面板类…

计算机毕业设计----SSH实现的一个宠物商城

项目介绍 本项目分为前后台&#xff0c;分为管理员与用户两种角色&#xff0c;普通用户登录前台&#xff0c;管理员登录后台&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,用户管理,管理商品,商品分类管理,订单管理,留言管理,公告管理,新闻管理等功能。 用户…

MySQL索引创建原则和失效问题

一.索引创建原则 数据量较大,且查询比较频繁的表常作为查询条件、分组、排序的字段字段内容区分度高内容较长,使用前缀索引尽量创建联合索引要控制索引的数量如果索引列不能存储NULL值,请在创建表示使用NOT NULL约束它 二.索引失效 违反最左前缀法则范围查询右边的列,不能使用…

Linux文件同步

Linux文件同步 scp简介基本用法 rsync简介基本用法 tftp简介基本用法 其他命令ftpsftplftp 此博客将主要介绍Linux文件同步常用的两种命令&#xff1a;scp&#xff08;secure copy&#xff09;、rsync&#xff08;remote synchronization&#xff09;和tftp&#xff08;Trivial…

k8s源码阅读:Informer源码解析

写在之前 Kubernetes的Informer机制是一种用于监控资源对象变化的机制。它提供了一种简化开发者编写控制器的方式&#xff0c;允许控制器能够及时感知并响应 Kubernetes 集群中资源对象的变化。Informer通过与Kubernetes API服务器进行交互&#xff0c;通过监听API服务器上资源…

计算机毕业设计 | SpringBoot宠物店管理系统(附源码)

1&#xff0c;绪论 项目背景 我国已经成为世界第二大经济体&#xff0c;经济实力高速发展以及百姓生活水平的普遍提高&#xff0c;不断地要求企业提供更加多元化的娱乐方式&#xff0c;更加快速和方便的服务&#xff0c;因此对宠物行业也提出了更加严格的要求&#xff0c;如管…