• 练习 : 面向对象


    1.建立一个汽车类Auto,包括轮胎个数,汽车颜色,车身重量,速度等属性,并通过不同的构造方法创建实例。至少要求 汽车能够加速 减速 停车。 再定义一个小汽车类CarAuto 继承Auto 并添加空调、CD属性,并且重新实现方法覆盖加速、减速的方法

    class Auto:
        def __init__(self, tyre=4, color='白色', weight=2, speed=0):
            self.tyre = tyre
            self.color = color
            self.weight = weight
            self.speed = speed
    
        def add_speed(self):
            self.speed += 2
            if self.speed >= 180:
                self.speed = 180
    
        def sub_speed(self):
            self.speed -= 2
            if self.speed < 0:
                self.speed = 0
    
        def stop(self):
            self.speed = 0
    
    
    class AirConditioner:
        def __init__(self, breed='格力', power=1, type='冷暖'):
            self.breed = breed
            self.power = power
            self.type = type
    
    
    class CD:
        def __init__(self, breed='索尼', color='黑色', price=1000):
            self.breed = breed
            self.color = color
            self.price = price
    
    
    class CarAuto(Auto):
        def __init__(self, tyre=4, color='白色', weight=2, speed=0):
            super().__init__(tyre, color, weight, speed)
            self.air_conditioner = AirConditioner()
            self.cd = CD()
    
        def add_speed(self):
            self.speed += 4
            if self.speed >= 240:
                self.speed = 240
    
        def sub_speed(self):
            self.speed -= 4
            if self.speed <= 0:
                self.speed = 0
    

    2.创建一个Person类,添加一个类字段用来统计Perosn类的对象的个数

    class Person:
    count = 0

    def __init__(self):
        if self.__class__ == Person:
            Person.count += 1
    

    class Student(Person):
    pass

    stu = Student()
    print(Person.count)
    p1 = Person()
    p2 = Person()
    print(Person.count)

    
    ### 3.创建一个动物类,拥有属性:性别、年龄、颜色、类型 (要求打印这个类的对象的时候以'/XXX的对象: 性别-? 年龄-? 颜色-? 类型-?/' 的形式来打印)
    ```python
    class Animal:
        def __init__(self, gender='雌', color='黑色', age=2, type='爬行'):
            self.gender = gender
            self.color = color
            self.age = age
            self.type = type
    
        def __repr__(self):
            return '/{}的对象: 性别-{} 年龄-{} 颜色-{} 类型-{}/'.format(self.__class__.__name__, self.gender, self.age, self.color, self.type)
    
    
    a1 = Animal()
    print(a1)
    

    4.写一个圆类, 拥有属性半径、面积和周长;要求获取面积和周长的时候的时候可以根据半径的值把对应的值取到。但是给面积和周长赋值的时候,程序直接崩溃,并且提示改属性不能赋值

    class ReadOnlyError(Exception):
        def __str__(self):
            return '该属性不能赋值'
    
    
    class Circle:
        pi = 3.1415926
    
        def __init__(self, radius):
            self.radius = radius
            self._area = 0
            self._perimeter = 0
    
        @property
        def area(self):
            return Circle.pi * self.radius * self.radius
    
        @property
        def perimeter(self):
            return 2 * Circle.pi * self.radius
    
        @perimeter.setter
        def perimeter(self, value):
            raise ReadOnlyError
    
        @area.setter
        def area(self, value):
            raise ReadOnlyError
    
    
    c1 = Circle(10)
    print(c1.area, c1.perimeter)
    

    5.写一个扑克游戏类, 要求拥有发牌和洗牌的功能(具体的属性和其他功能自己根据实际情况发挥)

    class PokerNum(Enum):
        Three = (3, '3')
        Four = (4, '4')
        Five = (5, '5')
        Six = (6, '6')
        Seven = (7, '7')
        Eight = (8, '8')
        Nine = (9, '9')
        Ten = (10, '10')
        J = (11, 'J')
        Q = (12, 'Q')
        K = (13, 'K')
        A = (14, 'A')
        Two = (15, '2')
        Joker_S = (16, 'Joker')
        Joker_B = (17, 'JOKER')
    
    
    # print(PokerNum.J, PokerNum.J.value)
    # # # 获取当前枚举类中所有的数据
    # for item in PokerNum.__members__.items():
    #     print(item, type(item[1]))
    
    
    class Poker:
        def __init__(self, color: str, num: PokerNum):
            self.color = color  # ♥、♠、♣、♦
            self.num = num   # 2-10,J,Q,K,A; 大王、小王
    
        def __repr__(self):
            return '{}{}'.format(self.color, self.num.value[1])
    
        # 让Poker对象可以比较大小(>)
        # p1 > p2  ->  p1.__gt__(p2)
        def __gt__(self, other):
            return self.num.value[0] > other.num.value[0]
    
    
    class PokerGame:
        def __init__(self):
            # 一副牌
            self.pokers = []
            # 创建牌
            nums = PokerNum.__members__.items()
            colors = ['♥', '♠', '♣', '♦']
            for num in nums:
                print('>>>')
                print(num)
                print(num[1])
                if num[1] == PokerNum.Joker_S or num[1] == PokerNum.Joker_B:
                    continue
                for color in colors:
                    # 创建牌对象
                    p = Poker(color, num[1])
                    self.pokers.append(p)
    
            self.pokers.append(Poker('', PokerNum.Joker_S))
            self.pokers.append(Poker('', PokerNum.Joker_B))
            # print(self.pokers)
    
        def __shuffle(self):
            # 方法一: 转换成集合
            # print(set(self.pokers))
            # 方法二: random.shuffle(列表)
            shuffle(self.pokers)
            print(self.pokers)
    
        def deal(self):
            self.__shuffle()
            poker_iter = iter(self.pokers)
            p1 = []
            p2 = []
            p3 = []
            for _ in range(17):
                p1.append(next(poker_iter))
                p2.append(next(poker_iter))
                p3.append(next(poker_iter))
    
            # 排序
            # p1.sort(key=lambda item: item.num.value[0], reverse=True)
            # p2.sort(key=lambda item: item.num.value[0], reverse=True)
            # p3.sort(key=lambda item: item.num.value[0], reverse=True)
            p1.sort(reverse=True)
            p2.sort(reverse=True)
            p3.sort(reverse=True)
    
            return p1, p2, p3, list(poker_iter)
    
    
    game = PokerGame()
    # game.shuffle()
    print(game.deal())
    
    print(game.deal())
    

    6.(尝试)写一个类,其功能是: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):
            fen = float(value[1:3])
            miao = float(value[4:])
            self._time = fen*60 + miao
    
        def __repr__(self):
            return '{}:{}'.format(self.time, self.word)
    
        def __lt__(self, other):
            return self.time < other.time
    
    
    
    class LyricAnalysis:
    
        def __init__(self, song_name: str):
            self.__song_name = song_name
            self.__lyrics = []
    
        def __analysis_file(self):
            # 1.读歌词文件中的内容
            with open('files/'+self.__song_name+'.lrc', 'r', encoding='utf-8') as f:  # 歌词文件要自行添加
                while True:
                    line_content = f.readline()
                    if not line_content:
                        break
    
                    # 将时间和词分离
                    lines = line_content.split(']')
                    word = lines[-1]
                    for time in lines[:-1]:
                        lyric = Lyric()
                        lyric.time = time
                        lyric.word = word
                        self.__lyrics.append(lyric)
    
            # 对歌词进行排序
            self.__lyrics.sort(reverse=True)
            # print(self.__lyrics)
            print('解析歌词')
    
        def get_lyric(self, time):
            """根据时间获取歌词"""
            if not self.__lyrics:
                self.__analysis_file()
    
            # 找到第一个小于指定时间的歌词对象
            for lyric in self.__lyrics:
                if lyric.time <= time:
                    return lyric.word
    
    
    l1 = LyricAnalysis('蓝莲花')
    # l1.analysis_file()
    print(l1.get_lyric(100))
    print(l1.get_lyric(120))
    
  • 相关阅读:
    深度学习在graph上的使用
    简单区分单射、满射与双射
    CSS自定义属性expression_r
    在linux命令下访问url
    Linux添加/删除用户和用户组
    mysql命令
    LAMP 版本查看
    php 下载文件
    linux 自动备份数据库
    linux下添加定时任务
  • 原文地址:https://www.cnblogs.com/anjhon/p/11953428.html
Copyright © 2020-2023  润新知