day15 面向对象操作和pygame
1. 面向对象
1.多继承.
多继承:让一个类继承多个类
对象属性只能继承第一个类的对象属性,实际开发中不用
class Aianmal:
num = 00000
def __init__(self,name,age,color):
self.name = name
self.age = age
self.color = color
def show_info(self):
print("=====")
print("名字:%s,年龄:%s,颜色:%s"%(self.name,self.age,self.color))
class Fly:
info= 00
def __init__(self,distance = 0,speed = 0):
self.distance = distance
self.speed = speed
@staticmethod
def show():
print("会飞")
class Bird(Aianmal,Fly):
pass
print(Bird.num,Bird.info)
Bird.show()
bird1 = Bird("lorry",20,"yellow")
print(bird1.age)
bird1.show_info()
bird1.show()
2.多态:封装,继承,多态
类的特点:封装,继承,多态
- a封装:可以用多条数据和多个功能进行封装
- b继承:可以让一个类拥有另外一个类的属性和方法
- c多态:有继承就会有多态(一个事物的多种形态)
3.重载
1.别的语言重载
c++/java声明函数的语法
返回值类型 函数名(参数类型1,参数名1,参数类型2,参数名2){
函数体
}
int func1{
}
void func1(int a){
}
void func1(chart a){
}
void func1(int a,int b){
}
上面这四个函数是不同的函数(可以同时存在)
def func1()
pass
def func2()
pass
def func3()
pass
python中最终只保留最后一个func1,前面的会覆盖
2.运算符重载
python中使用运算符的时候,实质是在调用相应的魔法方法(python中每个运算符都对应一个魔法方法)
运算符重载:在不同的数据类中,实现同一个运算符对应的魔法方法,来让相应的类的对象支持相应的运算
注意>和<一般只是需要重载一个,另外一个会自动取反
class Student:
def __init__(self,name,score,age):
self.name = name
self.score = score
self.age = age
# 加法云算法的重载
def __add__(self, other):
# self + other
return self.score+other.score
def __sub__(self, other):
return self.age - other.age
def __lt__(self, other):
return self.score < other.score
def __gt__(self, other):
return self.age < other.age
def __repr__(self):
return ">"+str(self.__dict__)[1:-1] +"<"
stu1 = Student("小花",90,218)
stu2 = Student("小狗",50,22)
stu3 = Student("啊啊啊啊",72,23)
stu4 = Student("mlxg",00,22)
print(stu1+stu2)
print(stu1-stu2)
all_student = [stu1,stu2,stu3,stu4] #比较大小
all_student2 = [stu1,stu2,stu3,stu4]
print(all_student)
print(all_student2)
4.内存管理
1.堆和栈
内存区中分堆区间和栈区间:栈区间的内存的开辟和释放是自动的,堆区间的内存是手动释放和开辟。内存管理是堆区间的内存
2.数据的存储
- a.python中所有的数据都是对象,都是保存在堆中的
- b.python中所有的变量存储的都是存储堆中的数据的地址,存了对象的地址的变量又叫对象引用
- c.默认情况下,创建对象就会在堆中去开辟空间存储数据,并且将地址返回,如果对象是数字,字符串,不会直接开辟空间会做缓存,每次使用的时候,会先去缓存区中看,之前有没有存储过,如果有就直接返回之前存储的地址,如果没有才会开辟新的空间存储数据。
3.数据的销毁
python通过垃圾回收机制来管理内存的释放,java,c++等语言也是使用的垃圾回收机制
原理:看一个对象是否销毁,就看这个对象的引用计数是否为0,为0就销毁,不为0就不销毁。
引用计数:对象引用的引用个数(几个变量在村)
导入模块:from sys impot getrefcount
注意:垃圾回收其实就是回收引用计数为0的对象,但是系统不会时时刻刻的检测对象的引用计数是否为0,而是每隔一段时间检测一次,如果检测到垃圾就回收
from sys import getrefcount
# 1.增加引用计数:使用变量存对象的地址
list1 = [1] #对象[1]引用计数是1.
print(getrefcount(list1))
list2 = list1 #对象[1]引用计数是2
print(getrefcount(list1))
list3= [list1,100] #对象[1]引用计数是3
print(getrefcount(list1))
# 2.减少引用计数:
"""
a.删除引用
b.让当前对象的引用成为别的对象引用
"""
del list3[0]
print(getrefcount(list1))
list2 = 100
print(getrefcount(list1))
print(getrefcount(100))
2.pygame
1.pygame最小系统
import pygame
# 1.游戏初始化
pygame.init()
# 2.创建游戏窗口
"""
set_model(窗口的大小) - 值是元组 (分别是宽度和高度的)
宽度和高度的单位是像素(px)
"""
window = pygame.display.set_mode((400,600))
#将窗口填充成颜色fill(颜色)
window.fill((255,199,206))
pygame.display.flip() #将窗口展示到屏幕上
"""
计算机的三原色:红绿蓝(rgb)(r,g,b)
颜色值就是三个数字组成(0-255)
python中的颜色是一个元组,元组中是有三个颜色,分别是r,g,b
白色:(255,255,255)
黑色:(0,0,0)
红色 (255,0,0)
绿色 (0,255,0)
"""
# 3.创建循环
while True:
#4.不断的检测事件的发生
for event in pygame.event.get():
#区分不同的事件,做出不一样的反应
#判断关闭按钮是否被关机
if event.type == pygame.QUIT:
exit()
2.pygame图片操作
操作方法:
1.pygame.image.load("1407836432.jpg")
2.inmage_obj.get_size() 获取图片像素
3.pygame.transform.scale(inmage_obj,(200,350)) 调整图片大小
4.pygame.transform.rotozoom(inmage_obj,180,1.1)
a.缩放
pygame.transform.scale(图片对象,大小) - 将指定的图片缩放到指定的大小
返回新的图片对象
b.pygame.transform.rotozoom(图片对象,旋转角度,缩放比例)
import pygame
pygame.init()
window = pygame.display.set_mode((600,900))
window.fill((255,199,206))
#显示图片
#1.加载图片
inmage_obj = pygame.image.load("1407836432.jpg")
inmage_obj2 = pygame.image.load("1470198196.jpg")
# 打开指定位置的图片
#2.渲染图片
"""
blit(渲染对象,位置)
渲染对象 - 图片对象(显示什么)
"""
#3.获取图片代销
"""
图片对象。get_size - 获取图片大小
"""
image_w,image_h = inmage_obj.get_size()
inmage_obj = pygame.transform.rotozoom(inmage_obj,180,1.1)
window.blit(inmage_obj,((400-image_w)/2,(600-image_h)/2))
inmage_obj = pygame.transform.scale(inmage_obj,(200,350))
window.blit(inmage_obj,(100,200))
#4.图片缩放
"""
a.缩放
pygame.transform.scale(图片对象,大小) - 将指定的图片缩放到指定的大小
返回新的图片对象
b.pygame.transform.rotozoom(图片对象,旋转角度,缩放比例)
"""
pygame.display.flip()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
3.图形显示
几种形状的画法:
1.直线:line(画在哪儿,线的颜色,起点,终点,线宽)
pygame.draw.line(window,Color.red,(0,0),(200,200),10)
2.线段:lines(画在哪儿,线的颜色,是否闭合,点列表,线宽)
point = [(200,300),(150,350),(125,400),(150,450),(190,500)]
pygame.draw.lines(window,Color.black,False,point,20)
依次链接点列表中所有的点(是否闭合决定是否连接起点和终点)
3.圆:circle(画在哪儿,颜色,圆心坐标,半径,)
注意:线宽为0的时候画实心圆
pygame.draw.circle(window,Color.white,(150,200),80,3)
4.画弧线:arc(画在哪儿,颜色,矩形,起始弧度,终止弧度,线宽 = 1)
pygame.draw.arc(window,Color.blue,(150,300,200,350),0,math.pi,10)
矩形 - (x,y,width,heigth)x,y是矩形左上角的坐标,width,heigth是矩形的长宽
5.椭圆:ellipse(画在哪儿, 颜色,矩形, width=0)
pygame.draw.ellipse(window,Color.red,(10,250,200,350),10)
矩形 - (x,y,width,heigth)x,y是矩形左上角的坐标,width,heigth是矩形的长宽
# author_lorry
# date: 2018/11/23
import pygame
import math
from color import Color
window = pygame.display.set_mode((500,600))
window.fill((255,199,206))
pygame.draw.line(window,Color.red,(0,0),(200,200),10)
point = [(200,300),(150,350),(125,400),(150,450),(190,500)]
pygame.draw.lines(window,Color.black,False,point,20)
pygame.draw.circle(window,Color.white,(150,200),80,3)
pygame.draw.circle(window,Color.red,(250,200),80,3)
pygame.draw.circle(window,Color.green,(350,200),80,3)
pygame.draw.circle(window,Color.white,(200,300),80,3)
pygame.draw.circle(window,Color.white,(300,300),80,3)
pygame.draw.arc(window,Color.blue,(150,300,200,350),0,math.pi,10)
pygame.draw.ellipse(window,Color.red,(10,250,200,350),10)
pygame.display.flip()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
4.显示文字
a.系统字体pygame.font.SysFont(字体名,字体大小,是否加粗 =False,是否倾斜 = False)``
font = pygame.font.SysFont("Times",90)添加文字:
font.render(文字内容,是否平滑,文字颜色)将文字渲染到窗口上
window.blit(text,(300,300))```
b.自定义字体pygame.font.Font(字体文件路径,字体大小)
font1 = pygame.font.Font("aa.ttf",90)
text1 = font1.render("我爱❤你,亲爱的菇凉",True,(255,0,0))
将文字渲染到窗口上
window.blit(text1,(200,400))
import pygame
pygame.init()
window = pygame.display.set_mode((1400,750))
window.fill((255,199,206))
font = pygame.font.SysFont("Times",90)
font1 = pygame.font.Font("aa.ttf",90)
text = font.render("L'O'V U",True,(255,0,0))
window.blit(text,(300,300))
text1 = font1.render("我爱❤你,亲爱的菇凉",True,(255,0,0))
window.blit(text1,(200,400))
pygame.display.flip()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
5.游戏事件
不同的type值对应不同类型的事件
QUIT - 关闭按钮被点击
a.鼠标相关事件
MOUSEMOTION - (鼠标移动)
MOUSEBUTTONUP 鼠标弹起
MOUSEBUTTONDOWN - 鼠标按下
"鼠标弹起",event.pos
b.键盘事件 - 按得是哪个键
KEYDOWN 键盘按下
KEYUP 键盘弹起
event.key - 被按得键对应的字符的编码值