1.多继承
多继承:就是让一个类同时继承多个类
两个类的字段都能继承
两个类的方法都能继承
对象属性只能继承第一个类的对象属性
注意:实际开发一般不使用多继承
多态:
类的特点:封装、继承、多态
封装:可以对多条数据和多个功能进行封装
继承:可以让一个类拥有另外一个类的属性和方法
多态:有继承就有多态(一个事物的多种形态)
2.运算符重载
1.别的语言的函数和函数的重载
C++/java声明函数的语法:
返回值类型 函数名(参数类型1 参数名1, 参数类型2 参数名2){
函数体
}
int func1(){
}
void func1(int a){
}
void func1(int a, int b){
}
int func1(int a, int b){
}
这四个函数时不同的函数(可以同时存在)
python中的函数不支持重载
def func1():
pass
def func1(a):
pass
def func1(a, b):
pass
最终只有最后这一个func1,前面的会被覆盖
2.运算符重载
python中使用运算符的时候,实质是在调用相应的魔法方法。
(python中每个运算符都对应一个魔法方法)
运算符重载:在不同的类中实现同一个运算符对应的魔法方法,来让类的对象支持相应的运算
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __add__(self, other):
return self.age + other.age
def __sub__(self, other):
return self.age - other.age
# >,<只需要重载一个,另外一个自动支持
def __lt__(self, other):
return self.age < self.age
def __repr__(self):
return str(self.__dict__)[1:-1]
stu1 = Student('小明', 18)
stu2 = Student('小红', 20)
print(stu1 + stu2)
print(stu1 - 5)
list_stu = [stu1, stu2]
list_stu.sort()
print(list_stu)
3.内存管理机制
1.堆和栈
内存区域分堆区间和栈区间;栈区间的内存的开辟和释放是自动的,堆区间的内存是手动开辟和释放
内存管理管理的是堆区间的内存
2.数据的存储
a.python中所有的数据都是对象,都是保存在堆中的
b.python中所有的变量存储的都是存在堆中的数据的地址。存了对象地址的变量又叫对象的引用
c.默认情况下创建对象就会在堆中去开辟空间存储数据,并且将地址返回;
如果对象是数字和字符串,不会直接开辟空间,会做缓存,而且使用的时候会先去缓存中看之前有没有存过,
有就直接返回之前的数据的地址,没有才开辟新的空间存储数据
3.数据的销毁
python中通过垃圾回收机制来管理内存的释放
原理:看一个对象释放销毁就看这个对象的引用计数释放为0,为0就销毁
引用计数:对象的引用个数
getrefcount(对象) - 获取对象的引用计数
注意:垃圾回收机制其实就是回收引用计数是0的对象,但是系统不会时时刻刻的检测对象的引用计数释放为0,
而是隔一段时间检测一次,如果检测到垃圾就回收
循环引用:Python中会自动销毁,
from sys import getrefcount
# 1.增加引用计数:使用变量存对象的地址
list1 = [1] # 对象[1]的引用计数是1
print(getrefcount(list1))
list2 = list1 # 对象[1]的引用计数是2
print(getrefcount(list1))
list3 = [list1, 10] # 对象[1]的引用计数是3
print(getrefcount(list1)) # 这个函数引用时自动加1,结束后自动减1
2.减少引用计数
a.删除引用
b.让当前对象的引用成为别的对象的引用
print('-----------')
del list3[0]
print(getrefcount(list1))
list2 = 100
print(getrefcount(list1))
print(getrefcount(100))
4.游戏的最小系统
import pygame
1.游戏初始化
pygame.init()
2.创建游戏窗口
set_mode(宽度,高度) - 窗口大小是一个元组,有两个元素:width,height
单位是像素
window = pygame.display.set_mode((400, 600))
将窗口填充成指定的颜色
fill(颜色) - fill((r, g, b)) - python中的颜色是一个元组
计算机颜色:计算机三原色 - 红、绿、蓝(rgb)
颜色值就是由三个数字组成,分别代表红、绿、蓝(rgb),数字范围是:0 - 255
(255, 255, 255) - 白色
(0, 0, 0) - 黑色
(255, 0, 0) - 红色
(0, 255, 0) - 绿色
(0, 0, 255) - 蓝色
window.fill((150, 50, 50))
将窗口展示到屏幕上
pygame.display.flip()
3.创建游戏循环(死循环)
while True:
# 4.检测事件
for event in pygame.event.get():
# 1.区分不同的事件,做出不一样的反应
# 判断关闭按钮点击事件是否发生
if event.type == pygame.QUIT:
exit()
5.在窗口上显示图片
import pygame
pygame.init()
显示图片
1.加载图片
pygame.image.load(图片地址) - 加载指定路径下的图片返回一个图片对象
image_obj = pygame.image.load('基洛夫.jpg')
image_w, image_h = image_obj.get_size()
window = pygame.display.set_mode((800, 600))
window.fill((255, 255, 255))
2.渲染图片
blit(渲染对象, 渲染位置)
渲染对象 - 图片对象(显示什么)
渲染位置 - 元组,(x, y)
window.blit(image_obj, (200, 200))
3.获取图片的大小
图片对象.get_size() - 获取图片大小,返回值是一个元组,(width,height)
4.图片缩放和旋转
a.缩放
pygame.transform.scale(图片对象. 大小) - 将指定的图片缩放到指定的大小
new_image = pygame.transform.scale(image_obj, (100, 250))
# window.blit(new_image, (10, 300))
b.旋转缩放
pygame.transform.rotozoom(图片对象, 旋转角度, 缩放比例)
new_image1 = pygame.transform.rotozoom(image_obj, 0, 0.5)
window.blit(new_image1, (0, 0))
pygame.display.flip()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
6.在窗口上显示文字
import pygame
pygame.init()
window = pygame.display.set_mode((800, 600))
window.fill((255, 255, 255))
显示文字
1.创建字体对象
a.系统字体
pygame.font.SysFont(字体名, 字体大小, bold(是否加粗)=False, italic(是否倾斜)=False) - 返回字体对象
bold=False, italic=False
b.自定义字体
pygame.font.Font(字体文件路径, 字体大小)
font1 = pygame.font.SysFont('Times', 50, bold=True, italic=True)
# font1 = pygame.font.Font('aa.ttf', 50)
2.根据字体创建文字对象
render(文字内容, 是否平滑, 文字颜色)
text = font1.render('hello pygame, 你好!', True, (255, 0, 0))
3.将文字渲染到窗口上
window.blit(text, (150, 100))
pygame.display.flip()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
7.显示图形
import pygame
from color import Color
import math
pygame.init()
window = pygame.display.set_mode((800, 600))
window.fill((255, 255, 255))
显示图形
1.画直线
line(画在哪里, 线的颜色, 起点, 终点, 线宽=1)
pygame.draw.line(window, Color.green, (0, 0), (100, 100), 10)
lines(画在哪里, 线的颜色, 是否闭合, 点列表, 线宽)
依次连接点列表中所有的点,是否闭合决定是否连接起点和终点
points = [(110, 160), (150, 110), (200, 200), (500, 400), (300, 300)]
pygame.draw.lines(window, Color.green, False, points)
2.画圆
circle(画在哪里, 线的颜色, 圆心坐标, 半径, 线宽=0)
pygame.draw.circle(window, Color.red, (600, 200), 100, 1)
3.画弧线
arc(画在哪里, 线的颜色, 矩形, 起始弧度, 终止弧度, 线宽=1)
矩形 - (x, y, width, height) x,y决定矩形左上角的坐标,后面决定矩形的宽和高
pygame.draw.arc(window, Color.red, (10, 300, 200, 200), math.pi/4*5, math.pi/4*7)
4.画椭圆
ellipse(画在哪里, 线的颜色, 矩形, 线宽=0)
pygame.draw.ellipse(window, Color.red, (280, 400, 200, 100), 1)
5.画多边形
polygon(画在哪里, 线的颜色, 点列表, 线宽=0)
points1 = [(50, 100), (50, 200), (80, 300), (200, 200), (150, 50)]
pygame.draw.polygon(window, Color.black, points1, 1)
6.画矩形
rect(画在哪里, 线的颜色, 矩形, 线宽=0)
pygame.draw.rect(window, Color.black, (250, 250, 100, 100), 1)
pygame.display.flip()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()