2019-01-15

2019-01-15  本文已影响0人  Little茂茂
import json
# 1.声明一个电脑类: 属性:品牌、颜色、内存大小 方法:打游戏、写代码、看视频
# a.创建电脑类的对象,然后通过对象点的方式获取、修改、添加和删除它的属性
# b.通过attr相关的方法去获取、修改、添加和删除它的属性


class Computer:
    """
    电脑类
    """
    def __init__(self, brand='', color='', memory=0):
        self.brand = brand
        self.color = color
        self.memory = memory

    @staticmethod
    def play_game(game):
        print('玩儿%s' % game)

    def codding(self):
        print('用%s写代码' % self.brand)

    @staticmethod
    def watch_video(video):
        print('看%s' % video)


# 2.声明一个人的类和狗的类:
# 狗的属性:名字、颜色、年龄
# 狗的方法:叫唤
# 人的属性:名字、年龄、狗
# 人的方法:遛狗
# a.创建人的对象小明,让他拥有一条狗大黄,然后让小明去遛大黄
class Dog:
    def __init__(self, name='', color='', age=0):
        self.name = name
        self.color = color
        self.age = age

    def shout(self):
        print('%s在嗷嗷叫!' % self.name)


class Person:
    def __init__(self, name='', age=0, dog: Dog=None):
        self.name = name
        self.age = age
        self.dog = dog

    def took_the_dog(self):
        if self.dog:
            print('%s牵着%s在外面散步' % (self.name, self.dog.name))
        else:
            print('没有🐶!遛自己!')


# 3.声明一个圆类:
class YtValueError(Exception):
    def __str__(self):
        return '当前属性不能赋值!'


class Circle:
    pi = 3.14159265357

    def __init__(self, radius, x=0, y=0):
        self.radius = radius
        self.x = x
        self.y = y
        self._area = 0
        # self._perimeter = 0

    @property
    def area(self):
        return self.radius**2*Circle.pi

    @area.setter
    def area(self,value):
        raise YtValueError

    # def area(self):
    #     """面积"""
    #     return self.radius**2*Circle.pi
    #
    def perimeter(self):
        """周长"""
        return 2*Circle.pi*self.radius


# 4.创建一个学生类:
# 属性:姓名,年龄,学号
# 方法:答到,展示学生信息
# 创建一个班级类:
# 属性:学生,班级名
# 方法:添加学生,删除学生,点名, 求班上学生的平均年龄
class Student:
    def __init__(self, name='', age=0, study_id=''):
        self.name = name
        self.age = age
        self.study_id = study_id

    def replied(self):
        print('%s,到!' % self.name)

    def show_info(self):
        print('学号:%s 姓名:%s 年龄:%d' % (self.study_id, self.name, self.age))

    def add_to_file(self):
        """将对象保存到本地"""
        file_name = self.__class__.__name__+'.json'
        with open('files/'+file_name, 'w', encoding='utf-8') as f:
            json.dump(self.__dict__, f)

    @classmethod
    def get_student_in_file(cls):
        """将字典读出来抓换成对象"""
        file_name = cls.__name__+'.json'
        with open('files/'+file_name, encoding='utf-8') as f:
            dict1 = json.load(f)
            # 将字典转换成对象
            stu = cls()
            for key in dict1:
                setattr(stu, key, dict1[key])
            return stu


print('/=====验证=====')
stu1 = Student('小明', 18, '001')
stu1.add_to_file()

stu2 = Student.get_student_in_file()
print(stu2, stu2.name, stu2.age, stu2.study_id)

print('=====验证=====/')


class Class:

    def __init__(self, name, students: list = []):
        self.name = name
        self.students = students
        # 学号生成器
        self.__id_generation = ('stu'+str(num).rjust(3, '0') for num in range(100))

    def add_student(self):
        """添加学生"""
        # 1.输入信息
        name = input('姓名:')
        age = int(input('年龄:'))
        # 2.生成学号
        study_id = next(self.__id_generation)
        # 3.创建学生对象
        stu = Student(name, age)
        stu.study_id = study_id
        # 4.保存到班级中
        self.students.append(stu)

    def del_student_with_name(self, name):
        """按姓名删除学生"""
        count = 0
        for stu in self.students[:]:
            if stu.name == name:
                count += 1
                stu.show_info()
                value = input('是否删除(Y/N):')
                if value == 'Y' or value == 'y':
                    self.students.remove(stu)
        if count == 0:
            print('没有该学生!s')

    def call_the_roll(self):
        """点名"""
        for stu in self.students:
            print(stu.name)
            stu.replied()

    def get_mean_age(self):
        """求平均年龄"""
        sum1 = 0
        for stu in self.students:
            sum1 += stu.age
        return sum1/len(self.students)




def main():
    print('=============第一题==============')
    cmp1 = Computer('联想', '黑色', 8)
    print(cmp1.brand)
    print(getattr(cmp1, 'brand', 'mac'))

    cmp1.memory = 16
    setattr(cmp1, 'memory', 16)

    # del cmp1.color
    delattr(cmp1, 'color')

    print('=============第二题==============')
    p1 = Person('小明', 18)
    p1.dog = Dog('大黄', '黑色', 3)
    p1.took_the_dog()

    print('=============第三题==============')
    c1 = Circle(3)
    print(c1.area)

    c1.radius = 1
    print(c1.area)
    # c1.area = 6

    print('=============第四题==============')
    cl1 = Class('py1809')
    for _ in range(4):
        cl1.add_student()

    print(cl1.get_mean_age())



if __name__ == '__main__':
    main()
# 1.建立一个汽车类Auto,包括轮胎个数,汽车颜色,车身重量,速度等成员变量,并通过不同的构造方法创建实例。至少要求 汽车能够加速 减速 停车。
# 再定义一个小汽车类CarAuto 继承Auto 并添加空调、CD等成员变量 覆盖加速 减速的方法
class Auto:
    def __init__(self, tyre=4, color='', weight=0, speed=0):
        self.tyre = tyre
        self.color = color
        self.weight = weight
        self.speed = speed
        self.__max_speed = 200

    def add_speed(self, value):
        """加速"""
        if self.speed + value > self.__max_speed:
            self.speed = self.__max_speed
        else:
            self.speed += value

    def sub_speed(self, value):
        """减速"""
        if self.speed - value < 0:
            self.speed = 0

        else:
            self.speed -= value

    def stop(self):
        self.speed = 0


class CarAuto(Auto):
    def __init__(self, tyre=4, color='', weight=0, speed=0, cd='', air=''):
        super().__init__(tyre, color, weight, speed)
        self.CD = cd
        self.airConditioning = air


def main():
    pass


if __name__ == '__main__':
    main()
# 4.写一个类,其功能是:1.解析指定的歌词文件的内容 2.按时间显示歌词
# 提示:歌词文件的内容一般是按下面的格式进行存储的。
# 歌词前面对应的是时间,在对应的时间点可以显示对应的歌词
class Lyric:
    def __init__(self):
        self._time = 0
        self.word = ''

    @property
    def time(self):
        return self._time

    @time.setter
    def time(self, value: str):
        fen = value[1:3]
        miao = value[4:]
        self._time = float(fen)*60 + float(miao)

    def __gt__(self, other):
        return self.time > other.time

    def __repr__(self):
        return str(self.__dict__)


class LyricAnalysis:
    # 歌名,作为对象的属性,不同的歌对应不同的解析器对象
    def __init__(self, song_name: str):
        self.__song_name = song_name
        self.__all_lyric = []

    def __deal_line(self, line):
        """处理每一行的歌词"""
        # print(line)
        # 1.将时间和歌词分开
        lines = line.split(']')
        # 2.获取词
        word = lines[-1]
        times = lines[:-1]
        for time_str in times:
            # 创建歌词对象
            lyric = Lyric()
            lyric.word = word
            lyric.time = time_str
            # 保存歌词
            self.__all_lyric.append(lyric)

    def get_lyric(self, time):
        """获取指定时间对应的词"""
        if not self.__all_lyric:
            # 1.读文件中的内容
            try:
                with open('files/'+self.__song_name+'.lrc', encoding='utf-8') as f:
                    # 一行一行的读,读完为止
                    while True:
                        line = f.readline()
                        if not line:
                            break
                        else:
                            # 处理每一行的内容,分割出时间和词
                            self.__deal_line(line)
            except FileNotFoundError:
                return '[~~没有歌词~~]'

            # 排序
            self.__all_lyric.sort(reverse=True)

        # 获取时间对应的词
        for lyric in self.__all_lyric:
            if lyric.time < time:
                return lyric.word


def main():
    la1 = LyricAnalysis('蓝莲花')
    print(la1.get_lyric(15))
    print(la1.get_lyric(100))

    la2 = LyricAnalysis('烟圈')
    print(la2.get_lyric(20))


if __name__ == '__main__':
    main()

上一篇下一篇

猜你喜欢

热点阅读