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])