2019-08-09/10_Work_Day15

1. 建立一個(gè)汽車類Auto,包括輪胎個(gè)數(shù),汽車顏色,車身重量,速度等屬性,并通過(guò)不同的構(gòu)造方法創(chuàng)建實(shí)例。至少要求 汽車能夠加速 減速 停車。 再定義一個(gè)小汽車類CarAuto 繼承Auto 并添加空調(diào)、CD屬性,并且重新實(shí)現(xiàn)方法覆蓋加速、減速的方法
class CorrectType(Exception):
    """類型錯(cuò)誤異常"""

    def __str__(self):
        return 'Wrong type!'


class WriteError(Exception):
    """只讀異常"""

    def __str__(self):
        return 'Modify read-only properties!'


class Auto:
    """汽車類"""

    def __init__(self, tires_num, color, weight, speed=0):
        """
        :param tires_num: 輪胎個(gè)數(shù)
        :param color: 汽車顏色
        :param weight: 車身重量
        :param speed: 起始速度
        """
        self._tires_num = self.tires_num = tires_num
        self._color = color
        self.weight = weight
        if not (isinstance(speed, int) or isinstance(speed, float)) or speed < 0:
            raise CorrectType
        else:
            self._speed = speed

    @property
    def tires_num(self):
        return self._tires_num

    @tires_num.setter
    def tires_num(self, value):
        if not isinstance(value, int) or value <= 0:
            raise CorrectType
        self._tires_num = value

    @property
    def color(self):
        return self._tires_num

    @color.setter
    def color(self, value):
        if not isinstance(value, str):
            raise CorrectType
        self._tires_num = value

    @property
    def weight(self):
        return self._tires_num

    @weight.setter
    def weight(self, value):
        if not Auto.is_num(value):
            raise CorrectType
        self._tires_num = value

    @property
    def speed(self):
        return self._speed

    @speed.setter
    def speed(self, value):
        """速度只能通過(guò)加速/減速/停車方法改變"""
        raise WriteError

    def accelerate(self, sp):
        """加速"""
        if not Auto.is_num(sp):
            raise CorrectType
        old_speed = self.speed
        self._speed += sp
        print('The auto is accelerating({} -> {}), the current speed is {} km/h.'
              .format(old_speed, self.speed, self.speed))

    def decelerate(self, sp):
        """減速"""
        if not Auto.is_num(sp):
            raise CorrectType
        old_speed = self.speed
        self._speed = self._speed - sp if self._speed >= sp else 0
        print('The auto is decelerating({} -> {}), the current speed is {} km/h.'
              .format(old_speed, self.speed, self.speed))

    def stop(self):
        self._speed = 0
        print('The auto stopped, the current speed is {} km/h'.format(self.speed))

    @staticmethod
    def is_num(value):
        """是否是正數(shù)"""
        return isinstance(value, int) or isinstance(value, float) or value > 0

    def __repr__(self):
        return ''.join(['<', str(self.__dict__)[1:-1], '>'])


class CarAuto(Auto):
    """小汽車類"""

    def __init__(self, tires_num, color, weight, speed=0, air_conditioning=False, cd=False):
        """
        :param tires_num: 輪胎個(gè)數(shù)
        :param color: 汽車顏色
        :param weight: 車身重量
        :param speed: 起始速度
        :param air_conditioning: 是否有空調(diào)
        :param cd: 是否有CD
        """
        super().__init__(tires_num, color, weight, speed)
        self.air_conditioning = air_conditioning
        self.cd = cd

    def accelerate(self, sp):
        old_speed = self.speed
        self._speed += sp
        print('The car is accelerating({} -> {}), the current speed is {} km/h.'
              .format(old_speed, self.speed, self.speed))

    def decelerate(self, sp):
        """減速"""
        old_speed = self.speed
        self._speed = self._speed - sp if self._speed >= sp else 0
        print('The car is decelerating({} -> {}), the current speed is {} km/h.'
              .format(old_speed, self.speed, self.speed))
auto1 = Auto(4, 'black', 300)

auto1.accelerate(20)
# The auto is accelerating(0 -> 20), the current speed is 20 km/h.
auto1.decelerate(10)
# The auto is decelerating(20 -> 10), the current speed is 10 km/h.
auto1.stop()
# The auto stopped, the current speed is 0 km/h

car1 = CarAuto(4, 'red', 200, air_conditioning=True)
car1.accelerate(40)
# The car is accelerating(0 -> 40), the current speed is 40 km/h.
car1.decelerate(20)
# 1The car is decelerating(40 -> 20), the current speed is 20 km/h.
2. 創(chuàng)建一個(gè)Person類,添加一個(gè)類字段用來(lái)統(tǒng)計(jì)Person類的對(duì)象的個(gè)數(shù)
class Person:
   count = 0

   def __init__(self, name, age, gender):
      self.name = name
      self.age = age
      self.gender = gender
      Person.count += 1

   def __repr__(self):
      return ''.join(['<', str(self.__dict__)[1:-1], '>'])
p1 = Person('Lina', 19, 'female')
print(Person.count)  # 1
p2 = Person('Jack', 18, 'male')
print(Person.count)  # 1
p3 = Person('Kin', 20, 'male')
print(Person.count)  # 1
3. 創(chuàng)建一個(gè)動(dòng)物類,擁有屬性:性別、年齡、顏色、類型 ,
要求打印這個(gè)類的對(duì)象的時(shí)候以'/XXX的對(duì)象: 性別-? 年齡-? 顏色-? 類型-?/' 的形式來(lái)打印
class Animal:
   def __init__(self, gender, age, color, species):
      self.gender = gender
      self.age = age
      self.color = color
      self.species = species

   def __repr__(self):
      """/XXX的對(duì)象: 性別-? 年齡-? 顏色-? 類型-?/'"""
      return '/{}的對(duì)象: 性別-{} 年齡-{} 顏色-{} 類型-{}/' \
         .format(self.__class__.__name__, self.gender, self.age, self.color, self.species)


class Cat(Animal):
   pass


class Dog(Animal):
   pass
a1 = Animal('公', 3, '白色', '哺乳動(dòng)物')
print(a1)  # /Animal的對(duì)象: 性別-公 年齡-3 顏色-白色 類型-哺乳動(dòng)物/
c1 = Cat('母', 2, '灰白相間', '布偶貓')
print(c1)  # /Cat的對(duì)象: 性別-母 年齡-2 顏色-灰白相間 類型-布偶貓/
d1 = Dog('公', 1, '黑', '哈士奇')
print(d1)  # /Dog的對(duì)象: 性別-公 年齡-1 顏色-黑 類型-哈士奇/
4. 寫一個(gè)圓類, 擁有屬性半徑、面積和周長(zhǎng);要求獲取面積和周長(zhǎng)的時(shí)候的時(shí)候可以根據(jù)半徑的值把對(duì)應(yīng)的值取到。但是給面積和周長(zhǎng)賦值的時(shí)候,程序直接崩潰,并且提示改屬性不能賦值
class Circle:
   pi = 3.141592653589793

   def __init__(self, radius):
      self.radius = radius
      self._area = Circle.pi * self.radius ** 2
      self._perimeter = 2 * Circle.pi * self.radius

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

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

   @property
   def perimeter(self):
      self._perimeter = 2 * Circle.pi * self.radius
      return self._perimeter

   @perimeter.setter
   def perimeter(self, value):
      raise WriteError

    def __repr__(self):
        return '<radius: {}, area: {}, perimeter: {}>'\
            .format(self.radius, self.area, self.perimeter)
c1 = Circle(10)
print(c1)  # <radius: 10, area: 314.1592653589793, perimeter: 62.83185307179586>
c1.area = 100  # __main__.WriteError: Modify read-only properties!
c1.perimeter = 30  # __main__.WriteError: Modify read-only properties!
c1.radius = 5
print(c1)  # <radius: 5, area: 78.53981633974483, perimeter: 31.41592653589793>
5. 寫一個(gè)撲克類, 要求擁有發(fā)牌和洗牌的功能(具體的屬性和其他功能自己根據(jù)實(shí)際情況發(fā)揮)
from random import shuffle


class CorrectType(Exception):
    """類型錯(cuò)誤異常"""

    def __str__(self):
        return 'Wrong type!'


class Poker:
    __colors = ['??', '??', '??', '??']
    __nums = ['3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A', '2']

    def __init__(self):
        self.__cards = [i for i in range(54)]
        shuffle(self.__cards)

        self.__top_cards = self.__cards[:3]

        # 對(duì)分組的牌排序
        self.__p1 = self.__p2 = self.__p3 = []
        self.__p1 = Poker.__sorted_cards(self.__cards[3:20])
        self.__p2 = Poker.__sorted_cards(self.__cards[20:37])
        self.__p3 = Poker.__sorted_cards(self.__cards[37:])

    @property
    def cards(self):
        return Poker.__set_cards(self.__cards)

    @cards.setter
    def cards(self, value):
        # self.__cards = [i for i in range(54)]
        # shuffle(self.__cards)
        raise WriteError

    @property
    def top_cards(self):
        return Poker.__set_cards(self.__top_cards)

    @top_cards.setter
    def top_cards(self, value):
        raise WriteError

    @property
    def p1(self):
        return Poker.__set_cards(self.__p1)

    @p1.setter
    def p1(self, value):
        raise WriteError

    @property
    def p2(self):
        return Poker.__set_cards(self.__p2)

    @p2.setter
    def p2(self, value):
        raise WriteError

    @property
    def p3(self):
        return Poker.__set_cards(self.__p3)

    @p3.setter
    def p3(self, value):
        raise WriteError

    @staticmethod
    def __sorted_cards(cards: list):
        """數(shù)組排序"""
        self_cards = sorted(cards)
        return self_cards

    def to_be_landlord(self):
        """叫地主階段,共兩輪,如果沒(méi)有玩家叫地主,流局重新洗牌"""
        times = 2
        while times:
            for i in range(1, 4):
                player = ''.join(['p', str(i)])
                choice = str(i) + input('{}是否叫地主(y/n):'.format(player))
                if choice[-1] == 'y':
                    # 拼接屬性名
                    player = '_Poker__' + player
                    # print(player)
                    # 動(dòng)態(tài)獲取當(dāng)前叫地主的玩家(p1-p3)
                    p = getattr(self, player)
                    # 將頂牌加入后,該玩家手牌重寫排序
                    setattr(self, player, Poker.__sorted_cards(p + self.__top_cards))
                    self.__top_cards.clear()
                    print('\n叫地主完成,地主為{}'.format(player[-2:]))
                    print(self)
                    return
                else:
                    continue
            times -= 1
        print('無(wú)人叫地主,本局流局...\n重新發(fā)牌:')
        self.__init__()
        print(self)
        self.to_be_landlord()

    @classmethod
    def __set_cards(cls, part_cards: list):
        """返回有花色和大小的展示牌組"""
        part_len = len(part_cards)
        out_cards = ['' for _ in range(part_len)]
        for index in range(part_len):
            if part_cards[index] == 52:
                out_cards[index] = 'Black Joker'
            elif part_cards[index] == 53:
                out_cards[index] = 'Red Joker'
            else:
                # 按大小排
                out_cards[index] = cls.__colors[part_cards[index] % 4] + cls.__nums[part_cards[index] // 4]
        return out_cards

    def __repr__(self):
        # return 'top_cards: {}\np1: {}\np2: {}\np3: {}' \
        #   .format(self.__top_cards, self.__p1, self.__p2, self.__p3)
        return 'top_cards: {}\np1: {}\np2: {}\np3: {}' \
            .format(self.top_cards, self.p1, self.p2, self.p3) if self.__top_cards else \
            'p1: {}\np2: {}\np3: {}'.format(self.p1, self.p2, self.p3)
    poker = Poker()
    print(poker)
    poker.to_be_landlord()
    '''
    top_cards: ['??J', '??5', '??7']
    p1: ['??4', '??4', '??5', '??5', '??6', '??7', '??7', '??8', '??8', '??10', '??J', '??Q', '??Q', '??K', '??K', '??K', '??2']
    p2: ['??3', '??3', '??3', '??4', '??6', '??7', '??8', '??9', '??10', '??J', '??A', '??A', '??A', '??2', '??2', 'Black Joker', 'Red Joker']
    p3: ['??3', '??4', '??5', '??6', '??6', '??8', '??9', '??9', '??9', '??10', '??10', '??J', '??Q', '??Q', '??K', '??A', '??2']
    p1是否叫地主(y/n):
    p2是否叫地主(y/n):
    p3是否叫地主(y/n):
    p1是否叫地主(y/n):y
    
    叫地主完成,地主為p1
    p1: ['??4', '??4', '??5', '??5', '??5', '??6', '??7', '??7', '??7', '??8', '??8', '??10', '??J', '??J', '??Q', '??Q', '??K', '??K', '??K', '??2']
    p2: ['??3', '??3', '??3', '??4', '??6', '??7', '??8', '??9', '??10', '??J', '??A', '??A', '??A', '??2', '??2', 'Black Joker', 'Red Joker']
    p3: ['??3', '??4', '??5', '??6', '??6', '??8', '??9', '??9', '??9', '??10', '??10', '??J', '??Q', '??Q', '??K', '??A', '??2']
    '''
6. (嘗試)寫一個(gè)類,其功能是:1.解析指定的歌詞文件的內(nèi)容 2.按時(shí)間顯示歌詞 提示:歌詞文件的內(nèi)容一般是按下面的格式進(jìn)行存儲(chǔ)的。歌詞前面對(duì)應(yīng)的是時(shí)間,在對(duì)應(yīng)的時(shí)間點(diǎn)可以顯示對(duì)應(yīng)的歌詞
[00:00.20]藍(lán)蓮花   
[00:00.80]沒(méi)有什么能夠阻擋   
[00:06.53]你對(duì)自由地向往   
[00:11.59]天馬行空的生涯  
[00:16.53]你的心了無(wú)牽掛   
[02:11.27][01:50.22][00:21.95]穿過(guò)幽暗地歲月   
[02:16.51][01:55.46][00:26.83]也曾感到彷徨   
[02:21.81][02:00.60][00:32.30]當(dāng)你低頭地瞬間  
[02:26.79][02:05.72][00:37.16]才發(fā)覺(jué)腳下的路   
[02:32.17][00:42.69]心中那自由地世界  
[02:37.20][00:47.58]如此的清澈高遠(yuǎn)   
[02:42.32][00:52.72]盛開著永不凋零   
[02:47.83][00:57.47]藍(lán)蓮花  
import time
import re


class CorrectType(Exception):
    """類型錯(cuò)誤異常"""

    def __str__(self):
        return 'Wrong type!'


class LyricsAnalysis:
    """解析歌詞文件及顯示歌詞"""
    def __init__(self):
        self.__lyric_list = []

    @property
    def lyric_list(self):
        return self.__lyric_list

    @lyric_list.setter
    def lyric_list(self, value):
        raise WriteError

    def analysis(self, path: str):
        """分析歌詞文件"""
        with open(path, 'r', encoding='utf-8') as f:
            line = f.readline()
            while line:
                r1 = re.compile(r'(\d{2}:\d{2}\.\d{2})')  # r1分離時(shí)間
                # r'([\u4E00-\u9FA5A-Za-z:./-]*)(?:\n)$'
                r2 = re.compile(r'(?:])(\D+)$')  # r2分離歌詞,匹配']'(不顯示)和非數(shù)字類型
                ti = r1.findall(line)
                ly = r2.findall(line)
                # print(ti, ly)
                if ti:
                    for key in r1.findall(line):
                        key = LyricsAnalysis.__to_second(key)
                        value = ly[0] if ly else ''
                        # print(key, value)
                        self.__lyric_list.append([key, value])
                self.__lyric_list.sort()
                line = f.readline()

    def show_lyrics(self, speed=0):
        """顯示歌詞"""
        for index in range(len(self.__lyric_list) - 1):
            last_time = self.__lyric_list[index][0]
            this_time = self.__lyric_list[index + 1][0]
            sleep_time = this_time - last_time
            if sleep_time > 2:
                if not index % 10:
                    speed = sleep_time / 15 + sleep_time / 100
                else:
                    speed = sleep_time / 15
            else:
                if not index % 5:
                    speed = sleep_time / 45 + sleep_time / 20
                else:
                    speed = sleep_time / 45
            while sleep_time > speed:
                # print(this_time - last_time)
                print('\r{}\t\t{:.2f}'.format(self.__lyric_list[index][1][:-1], sleep_time), end='')
                time.sleep(speed)
                sleep_time -= speed
        print('\r{}'.format(self.__lyric_list[-1][1]))

    @staticmethod
    def __to_second(str1: str):
        """字符串時(shí)間轉(zhuǎn)換秒"""
        r = re.compile(r'(?::)')  # 分離分鐘和秒
        result = r.split(str1)
        minute = result[0]
        return int(minute) * 60 + float(result[1])
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。