python创建对象先调用new()创建对象,然后再通过init()对对象进行初始化
def new(cls,args,*kwargs):
创建对象的代码块
在调用init()的时候,对象已经被new()方法创建了
本质上,python中类可以调用类中的所有方法
1.多继承(了解)
python中的类支持多继承,但是不建议使用
多继承继承的时候,子类可以拥有所有父类的所有的方法和类的字段,但是只能继承第一个父类的对象属性
class Animal(Object):
def __init(self,name='小动物',age=0):
self.age = age
self.name = name
def eat(self):
print('%s在吃东西'%self.name)
class Fly:
def __init__(self):
self.max_height = 0
def fly(self):
print('最大能飞%d米'%self.max_height)
#Bird同时继承Animal类和Fly类
class Bird(Animal.Fly):
pass
if __name__ =='__main__'
bird =Bird()
print(bird.name,bird.age)
2.多态
多态指的是多种形态
有继承就有多态:不同类继承自同一个类其实就是对这个共同的父类的不同的形态,继承后对方法的重写也是多态的表现
3.封装、继承、多态
封装:一个类可以通过不同的方法对不同的功能进行封装。通过属性对不同的数据进行封装
继承:通过继承可以让子类拥有父类的属性和方法
4.包
将多个模块封装到一起,就是包。包就是有一个默认文件init.py的文件夹
导入包
方式一:import 包名.模块
-使用方式:包.模块.方法()
方式二:from 包名 import 模块
-使用方式:模块.方法()
方式三:from 包.模块 import 方法/变量/类
-使用方式:方法()
5.raise 错误类型
raise可以让程序主动崩溃,一般用于调试
raise:关键字
错误类型:必须是一个类,并且这个类是Exception的子类
6.音乐播放与歌词同步
from time import sleep
import _thread as thread
import pygame
class Lyric:
def __init__(self,time,word):
self.time = time
self.word = word
def __gt__(self,other):
return self.time > other.time
def __str__(self):
return '%.2f %s'%(self.time,self.word)
class LyricAnalysis:
#创建解析器对象的时候告诉我这个解析器是要解析那首歌
def __init__(self,song_name):
self.song_name = song_name
self.all_lyrics = []
self.__collect_lyric()
def __collect_lyric(self):
'''
将时间和歌词提取出来
'''
dic_words={}
try:
with open('./files/%s.txt'%self.song_name,'r',encoding='utf-8',errors='ignore') as f:
for line in f:
lst = line.split(']')
for key in lst[:-1:]:
times = key[1:].split(':')
fen = float(times[0])
miao = float(times[1])
new_time =fen*60+miao
lyric = Lyric(new_time,lst[-1])
self.all_lyrics.append(lyric)
self.all_lyrics.sort()
for key in dic_words.keys():
print(key,dic_words[key])
pass
except FileNotFoundError:
print('文件不存在')
def get_word(self,time):
for ly in self.all_lyrics:
if ly.time > time:
return ly.word
def print_word(self,window):
i = 0
font = pygame.font.Font('./font_01/aa.ttf', 30)
while i<len(self.all_lyrics)-1:
time = self.all_lyrics[i+1].time-self.all_lyrics[i].time
text = font.render(self.all_lyrics[i].word,True,(0,0,255),(0,255,255))
window.blit(text,(100,180))
pygame.display.update()
window.fill((255,255,255))
sleep(time)
i += 1
text = font.render(self.all_lyrics[-1].word,True,(0,0,255),(0,255,255))
window.blit(text,(150,180))
pygame.display.update()
def play_music(self):
pass
if __name__ == '__main__':
an1 = LyricAnalysis('nlh')
file = r'xwnlh.mp3'
pygame.init()
pygame.mixer.init()
track = pygame.mixer.music.load(file)
screen = pygame.display.set_mode([500,350])
screen.fill((255,255,255))
pygame.display.flip()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit(0)
if event.type == pygame.KEYDOWN:
thread.start_new_thread(an1.print_word,(screen,))
pygame.mixer.music.play()