python--面向对象-文件读写-异常

一、继承

定义一个类时,需要使用另外一个类的方法或属性,就可以通过继承实现

object是Python的顶级类,创建类是会自动继承,就拥有object中的方法

  • 定义格式

# 类的定义 
# 旧式类定义 一般在定义单个类时使用
class 类名:name = Nonedef func(self):pass
​
# 新式类定义   一般在继承时使用
class 类名(指定需要继承的类):name = Nonedef func(self):pass
​
​
# 新式类定义
class A():name = '张三'
​def func(self):# pass 不做处理pass
# 旧式类
class B:
​age = 20
​def fucn(self):pass
​
​
print(A.name)
print(B.age)

1-1 单继承

一次继承一个类

(1)Father类有一个性别属性,默认为男,同时,Father跑步速度快;

(2)如果Son类也想要拥有这些属性和方法,该怎么做呢?

(3)执行程序,观察程序效果。

# 单继承  只继承一个类
class Father:
​gender = '男'
​def run(self):print('跑步很快')
​
​
​
# 子类继承父类获取父类中属性和方法
class Son(Father):
​# 定义子类的属性和方法age = 20
​def play(self):print('玩游戏')
​# 创建子类对象
s = Son()
# 使用子类对象操作父类的属性和方法以及自己的属性和方法
print(s.gender)
print(s.age)
​
s.run()
s.play()

(1)从前,有个摊煎饼的老师傅[Master],在煎饼果子界摸爬滚打多年,研发了一套精湛的摊煎饼(flapjack)技术;

(2)渐渐地,老师傅老了,就想着把这套技术传授给他唯一的最得意的徒弟[Apprentice];

(3)试着通过初始化、无参、定义方法与单继承来模拟程序。

# 单继承的使用
class Master:name = '师父'
​def flapjack(self):print('摊鸡蛋煎饼')
​
​
​
class Apprentice(Master):# 子类继承后可以不定义属性和方法,直接使用父类的方法pass
​
​
a = Apprentice()
​
# 子类使用父类方法
a.flapjack()

1-2 多继承

继承多个类

(1)徒弟是个爱学习的好孩子,想学习更多的摊煎饼技术;

(2)于是,在百度搜索到黑马程序员学校[School],报班来培训学习如何摊煎饼;

(3)使用多继承形式模拟程序。

# 单继承的使用
class Master:name = '师父'
​def flapjack(self):print('摊鸡蛋煎饼')
​
​
class School:
​name = '学校'
​def flapjack(self):print('摊肉肠煎饼')
​
​
class Apprentice(Master,School):# 子类继承后可以不定义属性和方法,直接使用父类的方法
​pass
​
​
a = Apprentice()
​
# 子类使用父类方法
a.flapjack()
​
# 查看子类的继承父类顺序
print(Apprentice.__mro__)​

(1)可以发现老师傅[Master]、培训学校[School]都有摊煎饼方法;

(2)在徒弟对象中调用摊煎饼方法,会执行哪个父类的方法呢?

调用第一个父类的方法,print(Apprentice.__mro__) # 查看类的继承执行顺序

(3)思考:当给父类培训学校[School]新增编程方法后,子类能调用方法吗?

多继承时,父类方法都能被继承,但是如果有相同方法名,则在执行方法时,会按照print(Apprentice.__mro__)显示的顺序查找方法执行

如果想要能后执行所有父类方法,则需要将函数名字进行修改,避免函数名冲突

# 单继承的使用
class Master:name = '师父'
​def master_flapjack(self):print('摊鸡蛋煎饼')
​
​
class School:
​name = '学校'
​def school_flapjack(self):print('摊肉肠煎饼')
​
​
class Apprentice(School,Master):# 子类继承后可以不定义属性和方法,直接使用父类的方法
​pass
​
a = Apprentice()
​
# 子类使用父类方法
a.master_flapjack()
a.school_flapjack()
​
# 查看子类的继承父类顺序
print(Apprentice.__mro__)
​

1-3 方法重写

子类中定义了和父类相同的方法,就是对父类方法的重写,在执行方法时,使用的是子类的逻辑代码

(1)徒弟非常认真学习,终于掌握了老师傅的技术;

(2)接着,自己潜心钻研出类独门配方的全新摊煎饼技术;

(3)使用方法重写对摊煎饼方法进行处理。

当对父类方法重写后,执行时只会执行子类的的方法逻辑,不会再执行父类方法中的逻辑

# 重写父类方法  子类继承父类后定义了一个和父类相同名字的方法
​
# 单继承的使用
class Master:name = '师父'
​def flapjack(self):print('摊鸡蛋煎饼')
​
​
class Apprentice(Master):
​# 子类中定义了自己方法,和父类方法名一样# 子类相当于重写了父类的方法,在执行时按照子类的逻辑执行def flapjack(self):print('摊手抓饼')
​
​
a = Apprentice()
a.flapjack()

子类重写父类方法,在调用时执行的子类的逻辑,还想调用父类方方法,需要借助super()方法实现


(1)徒弟在培训学校学习努力,不仅掌握了黑马摊煎饼配方、还创办了自己煎饼果子的品牌;[配方、品牌]

(2)配合着一起摊煎饼,做出了更加美味的煎饼果子;

(3)使用调用父类方法在__init__()和摊煎饼方法中处理。

# 重写父类方法  子类继承父类后定义了一个和父类相同名字的方法
​
# 单继承的使用
class Master:name = '师父'
​def flapjack(self):print('摊鸡蛋煎饼')
​
​
class Apprentice(Master):
​# 子类中定义了自己方法,和父类方法名一样# 子类相当于重写了父类的方法,在执行时按照子类的逻辑执行def flapjack(self):# 在子类中调用父类相同的方法  使用super()# 通过super可以获取父类对象print(super().name)print('摊手抓饼')super().flapjack()
​
​
a = Apprentice()
a.flapjack()

1-4 多层继承

(1)N年后,当初的徒弟也老了;

(2)因此,徒弟想要把"有自己品牌,也有黑马配方的煎饼果子"的所有技术传授给自己的小徒弟;

(3)请试着使用多层继承的方式完成案例。

# 多层继承
# 重写父类方法  子类继承父类后定义了一个和父类相同名字的方法
​
# 单继承的使用
class Master:name = '师父'def flapjack(self):print('摊鸡蛋煎饼')
​
​
class Apprentice(Master):name = '徒弟'def flapjack(self):print('摊手抓饼')super().flapjack()
​
​
​
class LittleApprentice(Apprentice):name = '小弟'
​def flapjack(self):print('蒸包子')super().flapjack()​
# 创建对象
la = LittleApprentice()
la.flapjack()
​
print(LittleApprentice.__mro__)
​
# 多层继承
# 重写父类方法  子类继承父类后定义了一个和父类相同名字的方法
​
# 单继承的使用
class Master:name = '师父'def flapjack(self):print('摊鸡蛋煎饼')
​
class School:
​name = '学校'
​def school_flapjack(self):print('摊肉肠煎饼')
​
​
class Apprentice(Master,School):name = '徒弟'def flapjack(self):print('摊手抓饼')super().flapjack()
​
​
​
class LittleApprentice(Apprentice):name = '小弟'
​def flapjack(self):print('蒸包子')super().flapjack()​
# 创建对象
la = LittleApprentice()
la.flapjack()
la.school_flapjack()
print(LittleApprentice.__mro__)
​

二、多态

多态指的是一类事物的多中形态

相同的方法,产生不同的执行结果

运算符 + * 的多态

int + int 加法计算

str + str 字符串拼接

list + list 列表的数据合并


在python中可以使用类实现一个多态效果

在python中使用重写的方式实现多态

(1)定义两个类:老师、车;

(2)定义老师类的属性:姓名,定义老师类的方法:开车、停车;

(3)定义车类的属性:类型,定义车类的方法:开启、停止;

(4)联系:老师开车,执行程序,观察效果;

# 多态
class Teacher:
​def __init__(self,name):self.name = name
​def run(self):print(f'{self.name}老师开车')
​def stop(self):print(f'{self.name}老师停车')
​
class Car:
​def __init__(self,type):self.type = type
​def start(self):print(f'{self.type}启动')
​def close(self):print(f'{self.type}熄火')
​
t = Teacher('张三')
c = Car('小汽车')
​
c.start()
t.run()
c.close()
t.stop()

使用继承方式,调整执行的方法

# 多态
class Teacher:
​def __init__(self,name):self.name = name
​def run(self):print(f'{self.name}老师开车')
​def stop(self):print(f'{self.name}老师停车')
​
class Car(Teacher):
​def __init__(self,type,name):super().__init__(name)self.type = type
​def start(self):print(f'{self.type}启动')super().run()def close(self):print(f'{self.type}熄火')super().stop()
​
​
c = Car('小汽车','张三')
​
c.start()
c.close()

(5)思考:老师有可能开小轿车、骑自行车、坐地铁等,该怎么改进程序呢?

使用子类的重写功能实现多态

多态实现的流程

1-定义一个父类,在父类中定义需要执行的业务方法,具体方法的逻辑不用实现,直接pass,由继承的子类实现

2-定义多个功能的子类继承父类,在子类中对父类方法重写,实现自己子类的逻辑

3-封装一个统一的函数处理方法,让开发人员调用该方法

# 多态
class Teacher:
​def __init__(self,name):self.name = name
​def run(self):pass
​def stop(self):pass
​
class Car(Teacher):
​def __init__(self,type,name):super().__init__(name)self.type = type
​def run(self):# 在多态实现时,子类继承父类并对父类方法进行重写print(f'{self.type}启动')print(f'{self.name}老师开车')def stop(self):print(f'{self.type}熄火')print(f'{self.name}老师停车')
​
class Metro(Teacher):
​def __init__(self,type,name):super().__init__(name)self.type = type
​def run(self):# 在多态实现时,子类继承父类并对父类方法进行重写print(f'{self.type}启动')print(f'{self.name}老师乘坐地铁')def stop(self):print(f'{self.type}到站')print(f'{self.name}老师下车')
​
​
# 单独封装一个行为函数
# 该函数就是对外提供一个函数接口,其他开发人员使用,就调用函数
def action(obj):# obj接收一个对象obj.run()obj.stop()
​
c = Car('越野车','张三')
action(c)
​
​
m = Metro('地铁1号线','李四')
action(m)
​

三、文件读写

通过文件读写完成对文件数据的处理

使用python中open方法实现对文件的读写

  • 格式

    • 会返回一个文件描述符

    • 使用文件描述符进行数据的读取或写入

f = open(文件位置,读写方式,文件读写格式(utf-8,gbk))
​
data = f.read() 读取
f.write(数据) 写入
​
f.close() 关闭文件

3-1 文件数据读取

# 文件数据读取
# 1-打开文件 创建文件描述符
# open的第一个参数指定读取的文件路径  可以使用绝对路径  也可以使用相对路径  windos的路径需要改斜杠
# 第二参数指定读写方式  r读 w写
# 第三个参数指定文件编码格式,方便读取中文数据  常用的两种utf-8  gbk
f = open('D/study/students.txt','r',encoding='utf-8')
​
# 读取数据文件
# 第一种 读取一行数据
# line_data1 = f.readline()
# print(line_data1)
# line_data2 = f.readline()
# print(line_data2)
​
# 第二种读取多行数据  将读取的多行数据放入列表中  该方式最常用
lines_data = f.readlines()
print(lines_data)
​
# 第三种  一次将所有数据读取出来当成一个完整的字符串数据  前面已经读取过数据 read就无法再读到数据 所以在实际开发中三种方式选择一种
# data = f.read()
# print(data)
# print(type(data))
​
​
# 数据取完成后可以使用close方法关闭文件
f.close()
​
​

3-2 数据写入文件

  • 写入方式

    • w 覆盖写入数据

    • a 追加写入数据

  • 写入类型

    • 要求写入数据是字符串类型

# 文件数据写入
# 1-先打开文件获取文件描述符  文件描述符用来操作文件
# 使用相对路径   代码文件运行的所在路径
# csv文件是以逗号分割的数据文件  可以使用excel打开
# w是覆盖写入数据  a是追加写入数据
f = open('./data.csv','a',encoding='utf-8')
​
# 写入数据
f.write('3,王五,20,男')
f.write('\n') # 写入换行符  进行换行
f.write('4,赵六,22,男')
f.write('\n')
​
#关闭文件
f.close()

3-3 二进制文件读写

  • 图片,视频,音频

    • 在进行二进制文件数据读写时需要使用 rb ,wb

# 二进制文件数据读写
# 1-打开文件获取文件描述符
f = open('D/study/1.jpeg','rb')
​
# 使用read一次性全部读取
data = f.read()
print(data)
# 关闭文件
f.close()
​
​
# 打开新的文件,将图片数据保存
f2 = open('./2.jpeg','wb')
​
f2.write(data)
​
f2.close()

3-4 with open 语法 读写文件

可以帮助开发人员在文件读写完成自动调用close

# 使用with  open自动关闭文件
with open('D/study/students.txt','r',encoding='utf-8') as f:data = f.read()print(data)
​
​
with open('data.json','w',encoding='utf-8') as f:f.write('{"id":1,"name":"张三"}')f.write('\n')f.write('{"id":2,"name":"李四"}')f.write('\n')
  • 文件后缀

    • txt

    • csv

    • json

    • 文件后缀和文件的数据本身没有直接关系

    • 后缀只是为了说明可以使用那种工具打开该文件,方便识别文件类型

四、异常处理

在程序运行时出现的错误,使用对应方法时没有按照开发语言的要求使用

一旦出现错误,会中断代码的执行。

实际开发中需要对异常问题单独判断处理,保证程序能持续运行

捕获到异常后根据需求处理,也可以不处理

4-1 常见异常

索引错误
  • 索引下标异常,一般发生在数据取值

字典key值错误
  • key值错误 字典取值时错误

类型错误
  • 类型错误 多个数据进行计算时或出现的问题

文件错误
  • 读取文件时问价不存在

# 索引下标取值错误
data = 'itcast'
data[100]
​
# 字典取值错误
data = {'name':'张三'}
data['age']
​
# 类型错误
data = '100'
data2 = 10
data3 = data/data2
​
# 文件读取错误 路径不存在
with open('aaa.txt','r',encoding='utf-8') as f:f.read()

4-2 异常捕获

通过语法捕获代码中的异常,根据异常信息,解决异常的问题,保证代码能持续运行

  • 格式

try:需要捕获遗产干的代码片段,有开发人员自己决定哪些代码需要捕获
except:捕获到异常后处理的逻辑
# 进行异常捕获
try:# 把出现的错误的代码逻辑放入try的作用域中data = 15/0
except:# 捕获到异常处理的业务逻辑print('异常被捕获')
# 异常被捕获后,可以正常执行后续的逻辑
print('其他代码逻辑')

4-3 指定异常类型捕获

# 可以捕获所有异常
try:data_str = 'itcast'# data_str[100]f = open('aasd.txt','r',encoding='utf-8')
except:# 捕获到异常处理的业务逻辑print('异常被捕获')# 异常被捕获后,可以正常执行后续的逻辑
print('其他代码逻辑')
​
# 捕获固定的异常 处理固定错误
try:# data = 15/0# f = open('aasd.txt', 'r', encoding='utf-8')data_str='itcast'data_str[100]
# 捕获指定异常
except (FileNotFoundError,ZeroDivisionError,IndexError):print('捕获0为除数的异常')
print('其他代码逻辑')

4-4 异常的其他处理

可以在处理异常时编写没有异常的逻辑

try:data = 15/0# Exception as e 获取异常的错误信息# 可以捕获到异常后输出错误信息
except Exception as e:print('异常被捕获')print(e)
else:print('else  没有异常逻辑')
finally:print('finally :无论是否有异常都执行')

4-5 函数中的异常处理

  • 在调用函数时进行异常捕获

def func(a,b):
​data = a + bprint(data)
​
try:# 调用其他开发人员编写的代码处理错误func('10',20)
except Exception as e:print(e)
​
  • 封装函数时异常捕获

# 函数的异常处理
def func(a, b):data = 0# 在封装的函数内捕获异常try:data = a + bexcept:# 函数内自己处理异常print('异常错误')return data
​
​
# 调用函数
func(10,'20')
​
  • 函数内捕获到异常不处理,再传递给掉用函数的地方

# 函数的异常处理
def func(a, b):data = 0# 在封装的函数内捕获异常try:data = a + bexcept:# 将异常的错误信息传递到调用地方 当前没有处理异常raise Exception('函数内计算错误')return data
​
​
​
# 调用函数时,捕获函数执行的异常
try:func(10,'20')
except Exception as e:print('异常捕获')print(e)
# 多个函数中都要使用的变量可以定义成全局变量,通过global声明,就可在多个函数就可以共享全局数据
name_list = []
password_list = []
​
# 登录注册功能
def login():# 函数作用域# 通过四个空格,来确认函数所执行的逻辑从哪里开始# 列表,元组,集合,字典数据可以省略global声明15/0global name_listglobal password_listfor num in range(3):  # [0,3)  0,1,2name = input('请输入用户名:')password = input('请输入密码:')# 先判断用户名是否正确if name in name_list:# 在判断密码是否正确if password in password_list:print('登录成功')# 适应break关键,会结束循环,不再进行取值breakelse:print('密码不正确')else:print('用户名不正确')
​
def register():global name_listglobal password_listname = input('请输入注册的用户名:')password = input('请输入出注册的密码:')# 将用户的名字和密码添加到全局的数据列表name_list.append(name)password_list.append(password)
​
while 1==1:num = input('1-登录 2-注册 3-支付 4-下单 5-退出程序:')if num == '1':# 函数功能的调用try:login()  # 函数名()except:print('登录出现错误')elif num == '2':register()elif num == '3':passelif num == '4':passelse:break

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

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

相关文章

Spring Boot 使用自定义注解和自定义线程池实现异步日志记录

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

如何保持气膜场馆内部空气新鲜—轻空间

气膜建筑作为现代建筑的一种新兴形式,以其独特的优势和设计受到了广泛欢迎。然而,保持气膜内部空气新鲜是一个必须解决的问题。我们通过配备先进的新风系统,提供了高效的解决方案。 新风系统的工作原理 气膜建筑内部空气的新鲜度主要依靠其配…

【vscode-快捷键 一键JSON格式化】

网上有很多JSON格式化工具,也有很多好用的在线json格式化工具。但是其实Vscode里面的可以直接格式化JSON,这里分享一个我常用的小插件 Prettify JSON 未格式化的JSON数据 召唤出命令行,输入prettify JSON 即可! ✿✿ヽ(▽)ノ✿

算法题:Java求数组中最大的值

采用分而治之(二分法)的思想去求解 分而治之:分而治之的思想可以用于解决很多问题,大概的思路就是把一个比较大的复杂的问题切分成小的块,然后分头去解决他们,最后再把结果合并起来,就是“分而治…

快速理解 Node.js 版本差异:3 分钟指南

Node.js 是一个广泛使用的 JavaScript 运行时环境,允许开发者在服务器端运行 JavaScript 代码。随着技术的发展,Node.js 不断推出新版本,引入新特性和改进。了解不同版本之间的差异对于开发者来说至关重要。以下是一个快速指南,帮…

C++高级 - 接口模板

目录 一. 接口 二. 模板 一. 接口 接口通常是通过抽象类或纯虚函数来实现的。 以下是一个使用抽象类来定义接口的示例代码&#xff1a; #include <iostream>class Interface { public:virtual void operation() 0; // 纯虚函数定义接口 };class ConcreteClass : pu…

【图书推荐】《Ubuntu Linux系统管理与运维实战》

本书重点 全面学习Ubuntu系统操作&#xff0c;快速掌握Linux日常管理和运维 安装和配置、桌面环境、文件系统、文件和目录管理、用户和权限管理系统的启动和关闭、服务和进程管理、软件包管理、磁盘和文件系统管理网络管理、网络服务管理、系统和网络安全 内容简介 Linux是…

计算机基础(5)——进制与进制转换

&#x1f497;计算机基础系列文章&#x1f497; &#x1f449;&#x1f340;计算机基础&#xff08;1&#xff09;——计算机的发展史&#x1f340;&#x1f449;&#x1f340;计算机基础&#xff08;2&#xff09;——冯诺依曼体系结构&#x1f340;&#x1f449;&#x1f34…

了解一下Ubuntu Linux

1.3.1 什么是Ubuntu Ubuntu这个名字非常神奇&#xff0c;它取自非洲南部祖鲁语的ubuntu&#xff0c;是一个哲学名称&#xff0c;其意思为“人性”或者“我的存在是因为大家的存在”。对于中国人来说&#xff0c;一般称呼它为乌班图。 Ubuntu是在Debian的基础上开发出来的&am…

opencv标定板图像位置

下载的C中使用的opencv库有圆点和方格的标定板图像 Opencv4.6.0\sources\doc

什么是泛洪攻击?DDos攻击也是泛洪攻击的一种?

在数字化时代的浪潮中&#xff0c;网络安全已成为一场没有硝烟的战争。其中&#xff0c;泛洪攻击作为一种常见的网络攻击手段&#xff0c;对个人用户、企业乃至国家网络安全构成了严重威胁。本文将对泛洪攻击进行深入剖析&#xff0c;包括其定义、原理、类型、影响以及应对策略…

嵌入式Linux系统编程 — 1.4 原子操作与竞争冒险

目录 1 竞争冒险 1.1 竞争冒险由来 1.2 竞争冒险理解 2 原子操作 2.1 O_APPEND 实现原子操作 2.2 pread()和 pwrite() 2.3 O_EXCL 标志创建文件 1 竞争冒险 1.1 竞争冒险由来 Linux 是一个支持多任务和多用户同时运行的操作系统&#xff0c;它允许多个进程同时执行。…

kube-promethesu新增k8s组件监控(etcd\kube-controller-manage\kube-scheduler)

我们的k8s集群是二进制部署 一、prometheus添加自定义监控与告警&#xff08;etcd&#xff09; 1、步骤及注意事项&#xff08;前提&#xff0c;部署参考部署篇&#xff09; 1.1 一般etcd集群会开启HTTPS认证&#xff0c;因此访问etcd需要对应的证书 1.2 使用证书创建etcd的…

Verilog实战学习到RiscV - 3 : ICEStick 评估板点灯

收到 ICESTICK 评估板后还没好好玩。先来点个灯&#xff0c;正好把之前介绍过的工具链串起来用一下。 代码 Verilog代码只有一个顶层模块top.v&#xff0c;定义如下&#xff1a; module top(output wire D1,output wire D2,output wire D3,output wire D4,output wire D5);a…

云手机定位切换,带来的不只是便利

当我们利用云手机的定位切换时&#xff0c;首先感受到的确实是极大的便利。 我们就像是拥有了瞬间移动的超能力&#xff0c;可以自由地在不同城市、甚至不同国家的虚拟场景中穿梭。无论是为了更精准地获取当地的信息&#xff0c;比如实时的交通状况、特色店铺等&#xff0c;还…

【CT】LeetCode手撕—3. 无重复字符的最长子串

目录 题目1- 思路1-1 模式1&#xff1a;涉及去重判断1-2 模式2&#xff1a;遍历字符串区间 2- 题解⭐无重复字符的最长子串——题解思路 3- ACM实现 原题链接&#xff1a;3. 无重复字符的最长子串 题目 无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有…

裸芯片绑定键合电阻器

EAK厚膜阻芯与有源裸片键合在一起封装 一般说明 精密引线键合电阻具有极高的稳定性和可靠性。电阻器经过激光微调&#xff0c;达到严格的公差。可定制值和该值的唯一标记&#xff0c;非常适合但不限于混合电路应用。 潜在作用&#xff1a; 医用植入式 军事/国防 混合设计 …

搭建chattts应用,做文字转语音

下载代码 git clone https://github.com/2noise/ChatTTS.git下载endpoint并上传&#xff1a; https://huggingface.co/2Noise/ChatTTS/tree/main 将上面下载的文件上传到服务器上 修改webui.py 更改为本地模型地址 import os import random import argparseimport torch i…

投资少见效快产量高-UMLChina建模知识竞赛第5赛季第13轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。 如果有第4题&#xff0c;第4题为附加题&am…

2024上海城博会:以绿色·节能·创新为主题,推动长三角一体化发展

2024上海城博会&#xff0c;作为“世界城市日”的重要主题活动之一&#xff0c;再次将全球的目光聚焦于这座东方明珠&#xff0c;展现了其在城市建设与管理领域的卓越成就。本次城博会由联合国人居署、上海市住房和城乡建设管理委员会联合主办&#xff0c;上海市绿色建筑协会承…