课后作业

  1. 什么是面向对象程序设计?面向对象程序设计的三大基本特征是什么?各有什么好处?

  2. 编写一个存储网站注册用户信息的 User 类,要求:

    • 用户名 name 只能使用 A~Za~z0~9-_ 这些字符,只能以字母开头,长度在 5~20 字符之间;
    • 用户密码 password 只能是编号范围为 32~126 之间的 ASCII 可显示字符,长度在 10~50 之间,必须至少各包含一个小写字母、大写字母和数字,以及至少包含一个除了字母和数字之外的特殊字符。
    • 可以通过 User(name, password) 的形式创建用户,后期也可以进一步通过 user.name = new_value 的形式修改用户名和密码。
    提示

    最好使用 @property 装饰器将用户名和密码设置为特征属性,并将实际的用户名和密码实例变量设置为私有的或保护的。另外请注意这里是以明文存储密码的,实际网站的密码都应该是不可逆加密存储的。

  3. 复习矿井通风课程中所学习的关于井巷通风阻力一章的知识,编写一个名称为 Roadway 的类,可以表示在矿井通风设计时井巷通风阻力计算的一些基本操作。以下已经搭建出该类的框架,请将其中标注为 TODO 的部分补充完整:

class Roadway:
    """表示一段巷道,该段巷道对应通风网络图中的一个边,所有数值单位都为国际标准单位"""

    def __init__(self, length, area, form, alpha, volume_flux):
        self.length = length  # 巷道的长度
        self.area = area  # 巷道的断面积
        self.form = form  # 巷道断面形状,参见 SectionalForm 类的定义
        self.alpha = alpha  # 巷道的摩擦阻力系数,可在通风教材最后的附录中通过查表得到
        self.volume_flux = volume_flux  # 巷道的风量(体积通量)
        self.air_density = 1.25  # 巷道内空气的平均密度
        # 总阻力与摩擦阻力的比值,也是总风阻与摩擦风阻的比值,取值范围为 1.1~1.15,
        # 一般新建矿井宜取 1.10,改扩建矿井宜取 1.15
        self.t2f_ratio = 1.1

    @property
    def perimeter(self):
        """根据巷道的断面面积、断面形状估算巷道的断面周长"""
        match self.form:
    case SectionalForm.Trapezoid:
        return 4.16 * (self.area ** 0.5)
    case SectionalForm.ThreeCenteredArch:
        return 3.85 * (self.area ** 0.5)
    case SectionalForm.SemiCircularArch:
        return 3.90 * (self.area ** 0.5)
    case _:
        return None

    def frictional_resistance(self):
        """计算该段巷道的摩擦风阻 Rf"""
        pass  # TODO: 请进一步完成该函数

    def local_resistance(self):
        """计算该段巷道的局部风阻 Rl"""
        return self.frictional_resistance() * (self.t2f_ratio - 1.0)

    def total_resistance(self):
        """计算该段巷道的总风阻 R"""
        return self.frictional_resistance() * self.t2f_ratio

    def velocity(self):
        """计算该段巷道的平均风速"""
        pass  # TODO: 请进一步完成该函数

    def frictional_loss(self):
        """计算该段巷道的摩擦阻力 hf"""
        pass  # TODO: 请进一步完成该函数

    def local_loss(self):
        """计算该段巷道的局部阻力 hl"""
        return self.frictional_loss() * (self.t2f_ratio - 1.0)

    def total_loss(self):
        """计算该段巷道的总阻力 h"""
        return self.frictional_loss() * self.t2f_ratio


class SectionalForm:
    """这里实际上是用类变量模拟其他语言的枚举变量,即三个类变量分别代表三种断面形状。
    Python 的标准库是有枚举(enum)模块的,不过这里为了展示类的用法而没有用该模块。"""
    Trapezoid = 1  # 梯形
    ThreeCenteredArch = 2  # 三心拱
    SemiCircularArch = 3  # 半圆拱


# 给定一段通风路线
vent_path = [
    Roadway(123.0, 16.0, SectionalForm.ThreeCenteredArch, 33.2e4, 90.0),
    Roadway(37.4, 13.6, SectionalForm.SemiCircularArch, 82.9e4, 74.5),
    Roadway(409.1, 13.2, SectionalForm.Trapezoid, 167.8e4, 64.5),
]

path_total_loss = 0.0  # 给定的通风路线的总阻力初值
# TODO: 请进一步编写程序,计算以上给定的通风路线的总阻力 path_total_loss
特征属性上机实验