python之装饰器,模块和文件操作和面向对象

1.装饰器详解(重点)

           1_1 装饰器                

程序运行的时候的记录 -- 日志

在实际工作中,python这样的东西,是放在服务器上运行的

日志其实就是记录下来当前程序的运行,协助我们定位问题

确定问题的方式(通过日志、报错信息去溯源)

import logging # 日志模块

日志模块,会有日志的级别定义

常见的日志级别:

warning:警告

error:报错

debug:调试

info:正常

# 级别是自己设置:我们可以通过自定义级别去确定什么东西该被记录,什么东西不被记录

# 设置的级别,会打印自己以及比自己小的级别信息!!!

# DEBUG > INFO > WARNING > ERROR

logging.basicConfig(level=logging.DEBUG)

日志打印

# logging.info("自定义的info级别的输出内容")
# logging.debug("自定义的info级别的输出内容")
# logging.warning("自定义的info级别的输出内容")
# logging.error("自定义的info级别的输出内容")

日志输出和print打印有一些区别:

# 1.颜色不一样

# 2.语法不一样

# 3.日志打印的时候,会带有用户信息

注意事项:控制台里面的打印,有可能是日志在前,也有可能是print在前(日志和print打印的输出级别没有先后顺序 -- 并行

装饰器的作用:可以在原有的函数之前、之后进行代码的补充(强化)

语法规则:

def 外层函数(设置一个参数,用来接收调用函数的本体):
    
    def 内置函数():
        你要添加的前/后的代码补充
    
    return 内置函数的名称

装饰器的传参

 def login_zsq(fun_name):
     def login_nzhs(username, password):
         print(f"username:{username}")
         print(f"password:{password}")

         # if username == "admin" and password == "123456":
         #     print("账号验证成功,允许登录")

         fun_name(username, password)  # 此时在调用fun4函数,但是fun4函数定义了两个参数,并未传值

     return login_nzhs


 @login_zsq
 def fun4(username, password):
     if username == "admin" and password == "123456":
         print("账号验证成功,允许登录")

 fun4(username="admin", password="123456")

 调用装饰器的时候,第一次传参,先给谁?
装饰器里面的内置函数,需要定义参数用来接收

 既然内置函数可以接收值,那么原函数fun4怎么接收传进来的值?
 在装饰器里面调用原函数执行的时候,把参数同时传递给他

装饰器的规则:

在需要执行函数的头部,加上@符号--如果存在这个@后面的函数名称,就会先去执行这个函数 

装饰器的固定写法

 

2.模块

2_1 模块的概念:

包(package)和模块(module)

包就是python中的文件夹(图标有小圆点、有一个__init__.py文件)

模块就是我们的文件名(不包含.py) 举例:模块的概念

示例:

import time  # 模块

# print(time.time())  # 当前时间的时间戳
# time.sleep(3)  # 强制等待x秒


# from 模块的路径  import ...
# from 包/模块 import 方法/函数/类/变量/其他的数据信息...

# from time import sleep
# from time import *

# sleep(3)

3.文件的操作

  3_1 文件读取:

磁盘:C盘... 500G、1TB、4TB

内存:内存地址,临时存储的空间 16G、24G、32G、64G

python 能够直接读取计算机文件 -- txt、excel、docx、csv、yaml...

语法规则:

open('文件路径', mode='读取方式', encoding='编码格式')

mode: r 读取 w 写入 a 追加写入

直接copy的路径,容易存在转义字符的情况,在引号的前面加一个小写的 r -- 防转义

示例:

file = open(r'/Volumes/attached/hcedu/vipCourse/pythonBasic/python_code/python_0307_234/day07/03 文件操作/load_txt',
            mode='r', encoding='utf-8')

# 读取文件 -- read()
# msg = file.read()
# print(f"读取到的内容:{msg}")

# 关闭文件 -- close()
# file.close()

# msg1 = file.read()
# print(f"读取到的内容:{msg1}")

# 问题:那么此时,msg还有没有值?可以的,因为变量的值已经存储在内存中了
# print(f"读取到的内容:{msg}")

# 按行读取 -- readline()
# msg2 = file.readline()
# print(f"读取到的内容:{msg2}")

# 读取所有的内容,按行划分列表元素 -- readlines()
# msg3 = file.readlines()
# print(f"读取到的内容:{msg3}")
# print(len(msg3))

3_2 文件写入:

# w:覆盖写入

# a: 追加写入

file = open("/Volumes/attached/hcedu/vipCourse/pythonBasic/python_code/python_0307_234/day07/03 文件操作/load_txt1",
            mode="a", encoding="utf-8")

# w:覆盖写入
# a: 追加写入

# 直接写入 -- write()
file.write("这个是我想写入的内容\n")
file.write("这个是我想写入的内容\n")
file.write("这个是我想写入的内容")
file.write("这个是我想写入的内容")

file.close()  # 养成好习惯

3.面向对象

3.1类的定义与实例化对象:

类的里面,称之为方法,类的外面,称之为函数

 类名的写法:驼峰式,首字母大写,每个单词紧贴着

定义一个类

        

class Teacher():
    name = "qsdd"
    age = 18
    sex = "man"
    job = "stu"

    def eat(self):
        print("wowowo")

    def teach(self):
        print("耶耶")

定义一个对象

qiye = Teacher()  # 实例化对象 -- 通过类实例化生成了一个对象 -- qiye
xiaoming = Teacher()  # 生成了另外一个对象 -- xiaoming

获取对象中的属性

print(f"""
    ----->{qiye.name}的自我介绍<-----
    name: {qiye.name}
    age: {qiye.age}
    sex: {qiye.sex}
    job: {qiye.job}
""")

调用对象中的方法

qiye.eat()
qiye.teach()

print("-" * 10)

xiaoming.eat()
xiaoming.teach()

修改对象中的属性

xiaoming.name = "dd"
xiaoming.age = 88
xiaoming.sex = "woman"
xiaoming.job = "Majordomo"

print(f"""
    ----->{xiaoming.name}的自我介绍<-----
    name: {xiaoming.name}
    age: {xiaoming.age}
    sex: {xiaoming.sex}
    job: {xiaoming.job}
""")

   3.2面向对象的应用

特征:封装、继承、多态

王者荣耀、英雄联盟:Hero -- 每一个英雄是不是都是一个对象?是

示例

"""
英雄名字
英雄的属性
英雄的技能一
英雄的技能二
英雄的技能三
英雄的终极技能

创造4个英雄:对象名字、属性、技能一、技能二、技能三、终极技能

后羿 射手 1.普攻 2.多重箭矢 3.落日余晖 4.灼日之矢
劫、刺客、诸刃、分身、鬼斩、瞬狱影杀阵
王昭君 法师 1.减速 2冰冻 3.冰暴
孙尚香 翻滚突袭 红莲爆弹 究极弩炮 活力迸发
"""


class Hero:

    # 构造方法 -- 用来接收实例化对象的时候,传进来的值
    # 每次实例化的时候,必定最先执行这个构造方法
    def __init__(self, hero_name, hero_attributes, hero_skill_one, hero_skill_two, hero_skill_three,
                 hero_skill_ultimate):
        # 把实例化对象传进来的值,赋值给当前对象的属性
        # self:表示当前对象
        self.hero_name1 = hero_name  # 不一定需要同名的
        self.hero_attributes = hero_attributes
        self.hero_skill_one = hero_skill_one
        self.hero_skill_two = hero_skill_two
        self.hero_skill_three = hero_skill_three
        self.hero_skill_ultimate = hero_skill_ultimate

    def skill_one(self):
        # 在类的里面,不同的方法中,调用同一个属性,需要带有self.开头
        print(f"{self.hero_name1} -- 释放了技能一:{self.hero_skill_one}")
        # print(f"{hero_name1}")  # 错误的示范

    def skill_two(self):
        print(f"{self.hero_name1} -- 释放了技能二:{self.hero_skill_two}")

    def skill_three(self):
        print(f"{self.hero_name1} -- 释放了技能三:{self.hero_skill_three}")

    def skill_ultimate(self):
        print(f"{self.hero_name1} -- 释放了终极技能:{self.hero_skill_ultimate}")


# 实例化对象
Houyi = Hero("后羿", "射手", "普攻", "多重箭矢", "落日余晖", "灼日之矢")
Jie = Hero("劫", "刺客", "诸刃", "分身", "鬼斩", "瞬狱影杀阵")
WangZhaoJun = Hero("王昭君", "法师", "减速", "冰冻", "冰暴", "凤求凰")
SunShangXiang = Hero("孙尚香", "射手", "翻滚突袭", "红莲爆弹", "究极弩炮", "活力迸发")

# 获取对象的属性
# print(f"Houyi对象中的名字:{Houyi.hero_name1}")
# print(f"Jie对象中的名字:{Jie.hero_name1}")
# print(f"WangZhaoJun对象中的名字:{WangZhaoJun.hero_name1}")
# print(f"SunShangXiang对象中的名字:{SunShangXiang.hero_name1}")
#
# print("-" * 100)

# 调用对象中的方法
# Houyi.skill_one()
# Jie.skill_one()
# WangZhaoJun.skill_one()
# SunShangXiang.skill_one()

# 练习:
print("-" * 100)
print("英雄登场")
print(f"""
    第一个英雄:{Houyi.hero_name1}
    英雄的属性:{Houyi.hero_attributes}
    英雄的技能一:{Houyi.hero_skill_one}
    英雄的技能二:{Houyi.hero_skill_two}
    英雄的技能三:{Houyi.hero_skill_three}
    英雄的终极技能:{Houyi.hero_skill_ultimate}
""")
print("-" * 100)
print(f"""
    第二个英雄:{Jie.hero_name1}
    英雄的属性:{Jie.hero_attributes}
    英雄的技能一:{Jie.hero_skill_one}
    英雄的技能二:{Jie.hero_skill_two}
    英雄的技能三:{Jie.hero_skill_three}
    英雄的终极技能:{Jie.hero_skill_ultimate}
""")
print("-" * 100)
print(f"""
    第三个英雄:{WangZhaoJun.hero_name1}
    英雄的属性:{WangZhaoJun.hero_attributes}
    英雄的技能一:{WangZhaoJun.hero_skill_one}
    英雄的技能二:{WangZhaoJun.hero_skill_two}
    英雄的技能三:{WangZhaoJun.hero_skill_three}
    英雄的终极技能:{WangZhaoJun.hero_skill_ultimate}
""")
print("-" * 100)
print(f"""
    第四个英雄:{SunShangXiang.hero_name1}
    英雄的属性:{SunShangXiang.hero_attributes}
    英雄的技能一:{SunShangXiang.hero_skill_one}
    英雄的技能二:{SunShangXiang.hero_skill_two}
    英雄的技能三:{SunShangXiang.hero_skill_three}
    英雄的终极技能:{SunShangXiang.hero_skill_ultimate}
""")

print("-" * 100)
print("第一回合:")
Houyi.skill_one()
Jie.skill_two()
WangZhaoJun.skill_three()
SunShangXiang.skill_one()

print("-" * 100)
print("第二回合:")
SunShangXiang.skill_three()
Jie.skill_three()
Houyi.skill_three()
WangZhaoJun.skill_ultimate()

print("-" * 100)
print("第三回合:")
Jie.skill_ultimate()
WangZhaoJun.skill_ultimate()
SunShangXiang.skill_ultimate()
Houyi.skill_ultimate()

4.类中的属性

4.1类属性的定义与调用

实例属性:实例对象的属性

定义在构造方法中的属性

公有实例属性:常规属性

私有实例属性:双下划线开头,只能在自己类中调用

例子如下

class Person:

    def __init__(self, name, age, sex, job):
        # 公有属性
        self.name = name
        self.age = age

        # 私有属性
        self.__sex = sex
        self.__job = job

    def eat(self):
        print(f"{self.name}是一个吃货!")

    def get_job(self):
        return self.__job

    def set_job(self, set_job):
        self.__job = set_job


qiye = Person("qsdd", 18, "man", "teacher")

封装 -- 提高数据的安全性,减少误操作

获取私有属性:

# 第一方式获取return
# print(qiye.get_job())

# 第二方式获取return
# job = qiye.get_job()
# print(job)

修改私有属性:

# qiye.set_job("测试")
# print(qiye.get_job())

内置属性:

"""
类名.__dict__  属性
类名.__doc__  :类的文档字符串
类名.__name__  :类名
类名.__module__  :类定义所在的模块(类的全名是"__main__.className")
类名.__bases__  :类的所有父类构成元素(包含类一个由所有父类组成的元组)
"""
# print(Person.__dict__)
# print(Person.__doc__)
# print(Person.__name__)
# print(Person.__module__)
# print(Person.__bases__)

类的公有和私有方法

类的方法:

私有方法就是两个下划线开头,只能在类中使用的方法

class Person:
    # 公有方法
    def eat(self):
        print("一个吃货!")

    # 私有方法
    def __work(self):
        print("工作:授课")

    def invoke_work(self):
        # 调用私有方法
        self.__work()  # 这个可不可以调用私有方法?
        print("invoke_work方法的调用")


qiye = Person()
# 调用公有方法
qiye.eat()

# 调用私有方法
# qiye.__work()  # 'Person' object has no attribute '__work'
qiye.invoke_work()

5.继承

5_1 单继承

示例如下

 class 类名(父类):
        子类独有的东西
        def 子类任何方法

子类可以享有父类的所有属性和方法

可以省略很多重复性的代码,可以直接使用父类提前写好的方法/属性

class Animal:
    def __init__(self):
        self.__num = 10
        self.lst1 = [1, 2, 3]

    def eat(self):
        print("动物喜欢吃东西")

    def get_num(self):
        return self.__num


# 继承父类

class Cat(Animal):
    num1 = 100

    def shout(self):
        print("猫叫:喵喵")


Tom = Cat()

# 调用自己类中的方法/属性
Tom.shout()
print(Tom.num1)

# 调用继承的父类中的方法/属性
Tom.eat()
print(Tom.lst1)
print(Tom.get_num())

5.2继承的传递性:

# 爷爷辈
class Animal:
    def __init__(self):
        self.__num = 10
        self.lst1 = [1, 2, 3]

    def eat(self):
        print("动物喜欢吃东西")

    def get_num(self):
        return self.__num


# 父辈
class Cat(Animal):
    num1 = 100

    def shout(self):
        print("猫叫:喵喵")

    def eat(self):
        print("猫喜欢吃猫粮")

# 子辈
class TomCat(Cat):
    lst2 = [1, 2]

    def speak(self):
        print("hello 我是Tom")

    def eat(self):
        print("我是Tom, 我喜欢吃肉")


tomcat = TomCat()
# 调用自己类中的属性和方法
# tomcat.speak()
# print(tomcat.lst2)

# 调用父类的属性和方法
# tomcat.shout()

# 调用爷爷辈的属性和方法
# tomcat.eat()

# 当爷爷辈和父辈,同时具备一个同名的方法,执行哪个?
# tomcat.eat()

# 当自己也具备一个同名的方法,执行哪个? -- 执行自己的,也叫做方法的重定义/重写
tomcat.eat()

多继承

语法规则

class 类名(父类1,父类2):
    规则和单继承没什么区别

例子如下

class Monkey:
    def eat(self):
        print("猴子喜欢吃香蕉")


class God:
    def fly(self):
        print("神仙可以飞")

    def eat(self):
        print("神仙喜欢吃蟠桃")


# 创建一个类,同时继承多个类
class SunWuKong(God, Monkey):
    def buddhist_pilgrimage(self):
        print("孙悟空需要去取经")


# 调用自己类的属性和方法
swk = SunWuKong()
swk.buddhist_pilgrimage()

# 调用父类的属性和方法
swk.eat()
swk.fly()

# 问题:如果两个父类,同时有一个同名的方法,调用的时候,执行哪个? -- 就近原则,谁在前面,听谁的
swk.eat()

6.多态

抽象概念:定义好一个制式,按照这个制式向接口去提供对应的不同的对象,根据你提供的不同对象来执行不同的操作 

示例:

支付方式:银行卡、微信、支付宝、刷脸...

# 定义一个初始化支付
class PayMent:

    def pay(self):
        print("请支付!")


# 定义多种不同的支付方式
class WeChat(PayMent):

    def pay(self):
        print("使用微信支付!")


class AliPay(PayMent):

    def pay(self):
        print("使用支付宝支付!")


class Card(PayMent):

    def pay(self):
        print("使用银行卡支付!")


# 定义一个进行支付的类
class StartPay:

    def start_pay(self, obj):  # 设置一个参数,接收对象

        # 当我接收到对象后,开始调用这个对象的方法
        obj.pay()


# 实例化对象
sp = StartPay()

wc = WeChat()
alp = AliPay()
cd = Card()

sp.start_pay(obj=wc)
sp.start_pay(obj=alp)
sp.start_pay(obj=cd)

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

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

相关文章

宏的优缺点?C++有哪些技术替代宏?(const)权限的平移、缩小

宏的优缺点&#xff1f; 优点&#xff1a; 1.增强代码的复用性。【减少冗余代码】 2.提高性能&#xff0c;提升代码运行效率。 缺点&#xff1a; 1.不方便调试宏。&#xff08;因为预编译阶段进行了替换&#xff09; 2.导致代码可读性差&#xff0c;可维护性差&#xff0…

Java线程池(更新中)

1.线程池介绍 顾名思义&#xff0c;线程池就是管理一系列线程的资源池&#xff0c;其提供了一种限制和管理线程资源的方式。每个线程池还维护一些基本统计信息&#xff0c;例如已完成任务的数量。 总结一下使用线程池的好处&#xff1a; 降低资源消耗。通过重复利用已创建的…

猎头告诉你正确的“离职流程”

往期热门文章&#xff1a; 1&#xff0c;史上最全猎头技能资料&#xff0c;独家最新放送 2&#xff0c;互联网大厂java面试题知识库&#xff08;100万字&#xff09; 3&#xff0c;一线互联网大数据面试题知识库&#xff08;100万字&#xff09; 4&#xff0c;中国猎头公司排行…

SQL优化详解

目录 插入数据 insert的优化&#xff08;少量数据&#xff09; 批量插入 手动事务提交 主键顺序插入 插入大量数据 主键优化 数据组织方式&#xff1a; 页分裂&#xff1a; 主键顺序插入的方式&#xff1a; 主键乱序插入&#xff1a; 页合并&#xff1a; 主键设计…

HTML5/CSS3粒子效果进度条 超炫酷进度条动画源码

特效介绍 之前我已经分享了几款效果很不错的CSS3进度条插件&#xff0c;比如CSS3 Loading进度条加载动画特效、CSS3 3D进度条按钮 18款精美样式。今天我再来分享一款很有特色的HTML5/CSS3进度条应用。这款进度条插件在播放进度过程中出现粒子效果&#xff0c;就像一些小颗粒从…

二本生如何从大一准备考研!?保姆级全攻略

如果是二本大学&#xff0c;那考研确实是一个很好的机会 如果大家就有考研的打算&#xff0c;那就好好学习&#xff0c;好好学习英语&#xff0c;数学&#xff08;理工科&#xff09;和专业课&#xff0c;这些课程在考研的时候是肯定会考的 特别是英语和数学&#xff08;理工…

每日Attention学习5——Multi-Scale Channel Attention Module

模块出处 [link] [code] [WACV 21] Attentional Feature Fusion 模块名称 Multi-Scale Channel Attention Module (MS-CAM) 模块作用 通道注意力 模块结构 模块代码 import torch import torch.nn as nnclass MS_CAM(nn.Module):def __init__(self, channels64, r4):super(…

五一开始内卷前端,如何迅速的一个月内找到工作!

写在前面 五一过了代表新的一年不知不觉过了半年了&#xff0c;各位工作找到怎么样&#xff0c;有没有在工作中遇到解决不了的问题&#xff0c;这些问题后面怎么处理了呢&#xff1f; hello大家好&#xff0c;我又又又来了&#xff0c;今天纯干货&#xff0c;上班的朋友适当摸…

【SAP ME 39】SAP ME WebService超时时间设置

禁止废话&#xff0c;直接上图&#xff01;&#xff01;&#xff01; SAP技术官方说明

Dark Reader:夜间模式,启动!

名人说&#xff1a;一点浩然气&#xff0c;千里快哉风。 ——苏轼 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、介绍二、下载安装1、Chrome应用商店&#xff08;需科学&#xff09;2、第三方直链下载 三、使…

深入探索数据链路层:网络通信的基石

⭐小白苦学IT的博客主页⭐ ⭐初学者必看&#xff1a;Linux操作系统入门⭐ ⭐代码仓库&#xff1a;Linux代码仓库⭐ ❤关注我一起讨论和学习Linux系统❤ 前言 在网络通信的宏伟世界中&#xff0c;数据链路层扮演着至关重要的角色。它位于物理层和网络层之间&#xff0c;不仅直接…

HuggingFace烧钱做了一大批实验,揭示多模态大模型哪些trick真正有效

构建多模态大模型时有很多有效的trick&#xff0c;如采用交叉注意力机制融合图像信息到语言模型中&#xff0c;或直接将图像隐藏状态序列与文本嵌入序列结合输入至语言模型。 但是这些trick为什么有效&#xff0c;其计算效率如何&#xff0c;往往解释得很粗略或者或者缺乏充分…

C++ Builder XE EnumWindowsProc遍历所有窗口的名称

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { // 这里可以添加你的处理逻辑 // 例如&#xff0c;将句柄添加到列表中或者其他操作 // 这里我们仅仅输出到调试窗口 OutputDebugString(L"枚举窗口句柄: "); char windowHandle[10];…

ROS 2边学边练(45)-- 构建一个能动的机器人模型

前言 在上篇中我们搭建了一个机器人模型(其由各个关节&#xff08;joint&#xff09;和连杆&#xff08;link&#xff09;组成)&#xff0c;此篇我们会通过设置关节类型来实现机器人的活动。 在ROS中&#xff0c;关节一般有无限旋转&#xff08;continuous&#xff09;,有限旋转…

【每日力扣】98. 验证二叉搜索树 与 108. 将有序数组转换为二叉搜索树

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 98. 验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&a…

【优选算法】——双指针——15. 三数之和

目录 1.题目 2.解法&#xff08;排序双指针&#xff09;&#xff1a; 算法思路&#xff1a; 3.代码实现 1.题目 15. 三数之和 提示 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足…

【LLM第三篇】名词解释:RLHF——chatgpt的功臣

RLHF (Reinforcement Learning from Human Feedback) &#xff0c;直译为&#xff1a;“来自人类反馈的强化学习”。RLHF是一种结合了强化学习和人类反馈的机器学习方法&#xff0c;主要用于训练大模型以执行复杂的任务&#xff0c;尤其是当这些任务难以通过传统的奖励函数来精…

重学java 33.API 4.日期相关类

任何事&#xff0c;必作于细&#xff0c;也必成于实 —— 24.5.9 一、Date日期类 1.Date类的介绍 1.概述: 表示特定的瞬间,精确到亳秒 2.常识: a.1000毫秒 1秒 b.时间原点:1970年1月1日 0时0分0秒(UNIX系统起始时间),叫做格林威治时间,在0时区上 c.时区:北京位于东八区,一个时区…

Linux 操作系统线程1

目录 一、线程 1.1线程的基本概念 1.2 线程相关的API函数 1.2.1 线程的创建 1.2.2 线程退出 1.2.3 线程等待函数 1.2.4 获取线程ID 1.2.5 线程取消 1.2.6 线程的清理函数 一、线程 1.1线程的基本概念 线程是属于进程&#xff1b;一个进程可以有多个线程&#xff…

salmon使用体验

文章目录 salmon转录本定量brief模式一&#xff1a;fastq作为输入文件需要特别注意得地方 模式二&#xff1a; bam文件作为输入 salmon转录本定量 brief 第一点是&#xff0c;通常说的转录组分析其中有一项是转录本定量&#xff0c;这是一个很trick的说话&#xff0c;说成定量…
最新文章