1.多继承
-
多继承就是让一个类同时继承多个类
-
注意:实际开发一般不使用多继承
class Animal:
num=61
def __init__(self,name='小红',age=0,color='黑色'):
self.name = name
self.age = age
self.color = color
def show_info(self):
print('名字:%s 年龄:%s 颜色:%s'%(self.name,self.age,self.color))
class Fly:
info = '飞'
def __init__(self,distance=0,speed=0):
self.distance = distance
self.speed = speed
@staticmethod
def show():
print('飞')
#让birds同时继承Animal,Fly
class Birds(Animal,Fly):
pass
#两个类的字段都会继承
print(Birds.num,Birds.info)
Birds.show()
#两个类的方法都能继承,对象属性只能继承第一个类的对象属性
b1 = Birds()
print(b1.name)
2.多态
- 类的特点:封装,继承,多态
封装:可以对多条数据(属性)和多个功能(方法)进行封装
继承:可以让一个类拥有另一个类的属性和方法
多态:有继承就有多态(一个事物的多种形态)
3.运算符重载
3.1.python中函数不支持重载,
3.2.运算符重载
- python中使用运算符的时候实质实在调用相应的魔法方法(python中每一个运算符都对应一个魔法方法)
运算符重载:在不同的类中实现同一个运算符对应的魔法方法,来让类的对象支持相应的运算
class Student(object):
def __init__(self,name='',score=0,age=0):
self.name=name
self.score=score
self.age = age
# + 重载
'''
数据1 + 数据2 -- 数据1或传给self,数据2会传给other
'''
def __add__(self, other):
#self是+前面的,other是+后面的
return self.score + other.score
# - 运算
def __sub__(self, other):
#self - other
return self.score - other.score
#注意 大于和小雨一般情况下只需要重载一个,另外一个自动支持
# < 运算
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('小红',99,18)
stu2 = Student('小花',95,19)
stu3 = Student('小黄',96,18)
stu4 = Student('小蓝',97,19)
print(stu1 + stu2)
print(stu1 - stu2)
all_student = [stu1,stu2,stu3,stu4]
print(all_student)
print(max(all_student))
4.内存管理机制
4.1.堆和栈
内存区域中分为堆区间和栈区间
栈区间的内存的开辟和释放是自动的
堆区间的内存是手动的开辟和释放的
内存管理管理的是堆区间:
4.2.数据的存储
a.python中所有的数据都是对象,都是存在堆中的
b.python中所有的变量存储的都是存在堆中的数据的地址。(存了对象地址的变量,又叫对象的引用)
c.默认情况下,创建对象就会在堆中去开辟空间存储数据,并且将地址返回,如果对象是数字或字符串会先做缓存,而且使用的时候会先去缓存中看之前有没有存过,如果有就直接返回之前的数据的地址,如果没有才会开辟新的空间储存
4.3.数据的销毁
python中通过‘垃圾回收机制’来管理内存的释放
原理:看一个对象是否销毁,就看这个对象的引用计数是否为0,为0就销毁,不为0就不销毁
引用计数:对象的引用个数
- 注意:垃圾回收其实是回收引用计数是0的对象,但系统不会时时刻刻的检测对象的引用计数是否为0
而是隔一段时间检测一次
from sys import getrefcount
'''
getrefcount(对象)- 获取指定对象的引用计数
4.3.1.增加引用计数 : 使用变量存对象的地址
list1 = [1] #d对象[1]的引用计数是1
list2 = list1 # 对象[1]的引用计数是2
list3 = [list1,100] #对象[1]的引用计数是3
print(getrefcount(list1))
4.3.2.减少引用计数
a.删除引用
b.让当前对象的引用成为别的对象的引用
5.pygame
5.1游戏的最小系统
import pygame
import random
#1.游戏初始化
pygame.init()
#创建游戏窗口
'''
set_mode(窗口大小)- 窗口大小是一个元祖。有两个元素:width,height
set_mode((宽度,高度))
宽度和高度的单位是像素
'''
window = pygame.display.set_mode((600,800))
#将窗口填充成指定的颜色
'''
fill(颜色)- fill((r,g,b))
计算机颜色- 计算机三原色 -红,绿,蓝(RGB)
颜色值就是由三个数字组成,分别代表红、绿、蓝 数字范围(0-255)
python中的颜色是一个元祖,元祖中有三个颜色,分别是 r,g,b
(255.255.255)-白色
(255.0.0)-红色
(0.0.0)-黑色
(0.255.0)-绿色
'''
window.fill((random.randint(0,255)))
#将窗口展示到显示设备上
pygame.display.flip()
#3.创建游戏循环
while True:
#4.检测事件
for event in pygame.event.get():
#区分不同事件,做出不同反应
pass
#判断关闭按钮点击事件是否发生
if event.type == pygame.QUIT:
exit()#窗口关闭
5.2在窗口显示图片
import pygame
import random
pygame.init()
window = pygame.display.set_mode((1500,800))
window.fill((random.randint(0,255)))
#--========显示图片==========
#1.加载图片
'''
pygame.image.load(图片地址)- 加载指定路径下的图片,返回一个图片对象
'''
image_obj = pygame.image.load('files/27r58PICkj7_1024.jpg')
#2.渲染图片
'''
blit(渲染对象,位置)
渲染对象:图片对象(显示对象)
位置:元祖,(x坐标,y坐标)
'''
# window.blit(new_image2,(100,200))
#3.获取图片大小
'''
图片对象.get_size()- 获取图片大小,返回值是元祖(width,height)
'''
im_w,im_h = image_obj.get_size()
#4.图片缩放和旋转
'''
a.缩放
pygame.transform.scale(图片对象,大小)-将指定图片缩放之指定大小
'''
new_image = pygame.transform.scale(image_obj,(50,20))
# window.blit(new_image,(500,200))
'''
b.旋转缩放
pygame.transform.rotozoom(图片对象,旋转角度,缩放比例)
'''
new_image2 = pygame.transform.rotozoom(image_obj,180,0.5)
window.blit(new_image2,(100,200))
#将窗口展示到显示设备上
pygame.display.flip()
#3.创建游戏循环
while True:
#4.检测事件
for event in pygame.event.get():
#区分不同事件,做出不同反应
pass
#判断关闭按钮点击事件是否发生
if event.type == pygame.QUIT:
exit()#窗口关闭
5.3显示文字
import pygame
import random
pygame.init()
window = pygame.display.set_mode((800,500))
window.fill((255,255,255))
#--========显示文字==========
#1.创建字体对象(选笔)
'''
a.系统字体
pygame.font.SysFont(字体名,字体大小,是否加粗=False,是否倾斜=False)-返回字体对象
b.自定义字体
'''
font = pygame.font.SysFont('Times',20,True,True)
font1 = pygame.font.Font('files/aa.ttf',20)
#2.根据字体常见文字对象
'''
render(文字内容,是否平滑,文字颜色)
'''
text = font.render('hello pygame',True,(255,0,0))
text1 = font1.render('李毅猪皮',True,(255,0,0))
#3.将文字渲染到窗口上
window.blit(text,(100,100))
window.blit(text1,(300,100))
#将窗口展示到显示设备上
pygame.display.flip()
#3.创建游戏循环
while True:
#4.检测事件
for event in pygame.event.get():
#区分不同事件,做出不同反应
pass
#判断关闭按钮点击事件是否发生
if event.type == pygame.QUIT:
exit()#窗口关闭
5.4显示图形
import pygame
from color import Color
import math
# 游戏最小系统
pygame.init()
window = pygame.display.set_mode((400, 600))
window.fill((255, 255, 255))
# ======显示图形=========
# 1.画直线
"""
line(画在哪儿, 线的颜色, 起点, 终点, 线宽=1)
"""
pygame.draw.line(window, Color.green, (0, 0), (100, 100), 10)
"""
lines(画在哪儿, 线的颜色, 是否闭合, 点列表, 线宽=1)
依次连接点列表中所有的点(是否闭合决定是否连接起点和终点)
"""
points = [(10, 10), (100, 70), (100, 170), (40, 230), (40, 320)]
pygame.draw.lines(window, Color.red, True, points, 5)
# 2.画圆
"""
circle(画在哪儿, 颜色, 圆心坐标, 半径, 线宽=0)
注意:线宽为0的时候画实心圆
"""
pygame.draw.circle(window, Color.yellow, (100, 100), 80, 3)
# 3.画弧线
"""
arc(画在哪儿,颜色,矩形(Rect),起始弧度,终止弧度,线宽=1)
矩形 - (x, y, width, height); x,y是矩形坐上角的坐标,width,height是矩形的宽高
"""
pygame.draw.arc(window, Color.blue, (150, 300, 50, 100), 0, math.pi, 10)
pygame.display.flip()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
5.5事件和动画
import pygame
from color import Color
pygame.init()
window = pygame.display.set_mode((400, 600))
window.fill((255, 255, 255))
# 在这儿写的代码是静态的(界面上的内容)
x = 100
y = 100
width = 100
height = 80
pygame.draw.rect(window, Color.green, (x, y, width, height))
pygame.display.flip()
while True:
y += 3
# width -= 2
window.fill(Color.white) # 覆盖原来的状态
pygame.draw.rect(window, Color.rand_color(), (x, y, width, height))
pygame.display.update() # 重新显示
# 有事件产生的时候才会进入for循环
for event in pygame.event.get():
# 1.type属性
"""
不同的type值对应不同类型的事件
QUIT - 关闭按钮被点击事件
a.鼠标相关事件 - 按的位置
MOUSEMOTION - 鼠标移动
MOUSEBUTTONDOWN - 鼠标按下
MOUSEBUTTOUP - 鼠标弹起
event.pos - 获取鼠标事件产生的位置
b.键盘事件 - 按的是哪个键
KEYDOWN - 按键按下
KEYUP - 按键弹起
event.key - 被按的键对应的字符的编码值
"""
if event.type == pygame.QUIT:
exit()
elif event.type == pygame.MOUSEMOTION:
# print('鼠标移动', event.pos)
# pygame.draw.circle(window, Color.rand_color(), event.pos, 30)
# pygame.display.flip()
pass
elif event.type == pygame.MOUSEBUTTONDOWN:
# 鼠标按下要做什么就写在这儿
print('鼠标按下', event.pos)
pygame.draw.circle(window, Color.rand_color(), event.pos, 30)
pygame.display.flip()
elif event.type == pygame.MOUSEBUTTONUP:
print('鼠标弹起!', event.pos)
elif event.type == pygame.KEYDOWN:
print('按键按下')
print(event.key, chr(event.key))
elif event.type == pygame.KEYUP:
print('按键弹起')
print(event.key, chr(event.key))
网友评论