1.多繼承
多繼承:就是讓一個(gè)類同時(shí)繼承多個(gè)類
兩個(gè)類的字段都能繼承
兩個(gè)類的方法都能繼承
對(duì)象屬性只能繼承第一個(gè)類的對(duì)象屬性
注意:實(shí)際開(kāi)發(fā)一般不使用多繼承
多態(tài):
類的特點(diǎn):封裝像吻、繼承麸锉、多態(tài)
封裝:可以對(duì)多條數(shù)據(jù)和多個(gè)功能進(jìn)行封裝
繼承:可以讓一個(gè)類擁有另外一個(gè)類的屬性和方法
多態(tài):有繼承就有多態(tài)(一個(gè)事物的多種形態(tài))
2.運(yùn)算符重載
1.別的語(yǔ)言的函數(shù)和函數(shù)的重載
C++/java聲明函數(shù)的語(yǔ)法:
返回值類型 函數(shù)名(參數(shù)類型1 參數(shù)名1弹渔, 參數(shù)類型2 參數(shù)名2){
函數(shù)體
}
int func1(){
}
void func1(int a){
}
void func1(int a, int b){
}
int func1(int a, int b){
}
這四個(gè)函數(shù)時(shí)不同的函數(shù)(可以同時(shí)存在)
python中的函數(shù)不支持重載
def func1():
pass
def func1(a):
pass
def func1(a, b):
pass
最終只有最后這一個(gè)func1,前面的會(huì)被覆蓋
2.運(yùn)算符重載
python中使用運(yùn)算符的時(shí)候奇适,實(shí)質(zhì)是在調(diào)用相應(yīng)的魔法方法。
(python中每個(gè)運(yùn)算符都對(duì)應(yīng)一個(gè)魔法方法)
運(yùn)算符重載:在不同的類中實(shí)現(xiàn)同一個(gè)運(yùn)算符對(duì)應(yīng)的魔法方法芦鳍,來(lái)讓類的對(duì)象支持相應(yīng)的運(yùn)算
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
# >,<只需要重載一個(gè)嚷往,另外一個(gè)自動(dòng)支持
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.內(nèi)存管理機(jī)制
1.堆和棧
內(nèi)存區(qū)域分堆區(qū)間和棧區(qū)間;棧區(qū)間的內(nèi)存的開(kāi)辟和釋放是自動(dòng)的柠衅,堆區(qū)間的內(nèi)存是手動(dòng)開(kāi)辟和釋放
內(nèi)存管理管理的是堆區(qū)間的內(nèi)存
2.數(shù)據(jù)的存儲(chǔ)
a.python中所有的數(shù)據(jù)都是對(duì)象皮仁,都是保存在堆中的
b.python中所有的變量存儲(chǔ)的都是存在堆中的數(shù)據(jù)的地址。存了對(duì)象地址的變量又叫對(duì)象的引用
c.默認(rèn)情況下創(chuàng)建對(duì)象就會(huì)在堆中去開(kāi)辟空間存儲(chǔ)數(shù)據(jù),并且將地址返回贷祈;
如果對(duì)象是數(shù)字和字符串趋急,不會(huì)直接開(kāi)辟空間,會(huì)做緩存付燥,而且使用的時(shí)候會(huì)先去緩存中看之前有沒(méi)有存過(guò)宣谈,
有就直接返回之前的數(shù)據(jù)的地址,沒(méi)有才開(kāi)辟新的空間存儲(chǔ)數(shù)據(jù)
3.數(shù)據(jù)的銷毀
python中通過(guò)垃圾回收機(jī)制來(lái)管理內(nèi)存的釋放
原理:看一個(gè)對(duì)象釋放銷毀就看這個(gè)對(duì)象的引用計(jì)數(shù)釋放為0键科,為0就銷毀
引用計(jì)數(shù):對(duì)象的引用個(gè)數(shù)
getrefcount(對(duì)象) - 獲取對(duì)象的引用計(jì)數(shù)
注意:垃圾回收機(jī)制其實(shí)就是回收引用計(jì)數(shù)是0的對(duì)象闻丑,但是系統(tǒng)不會(huì)時(shí)時(shí)刻刻的檢測(cè)對(duì)象的引用計(jì)數(shù)釋放為0,
而是隔一段時(shí)間檢測(cè)一次勋颖,如果檢測(cè)到垃圾就回收
循環(huán)引用:Python中會(huì)自動(dòng)銷毀嗦嗡,
from sys import getrefcount
# 1.增加引用計(jì)數(shù):使用變量存對(duì)象的地址
list1 = [1] # 對(duì)象[1]的引用計(jì)數(shù)是1
print(getrefcount(list1))
list2 = list1 # 對(duì)象[1]的引用計(jì)數(shù)是2
print(getrefcount(list1))
list3 = [list1, 10] # 對(duì)象[1]的引用計(jì)數(shù)是3
print(getrefcount(list1)) # 這個(gè)函數(shù)引用時(shí)自動(dòng)加1,結(jié)束后自動(dòng)減1
2.減少引用計(jì)數(shù)
a.刪除引用
b.讓當(dāng)前對(duì)象的引用成為別的對(duì)象的引用
print('-----------')
del list3[0]
print(getrefcount(list1))
list2 = 100
print(getrefcount(list1))
print(getrefcount(100))
4.游戲的最小系統(tǒng)
import pygame
1.游戲初始化
pygame.init()
2.創(chuàng)建游戲窗口
set_mode(寬度,高度) - 窗口大小是一個(gè)元組,有兩個(gè)元素:width,height
單位是像素
window = pygame.display.set_mode((400, 600))
將窗口填充成指定的顏色
fill(顏色) - fill((r, g, b)) - python中的顏色是一個(gè)元組
計(jì)算機(jī)顏色:計(jì)算機(jī)三原色 - 紅饭玲、綠侥祭、藍(lán)(rgb)
顏色值就是由三個(gè)數(shù)字組成,分別代表紅茄厘、綠矮冬、藍(lán)(rgb),數(shù)字范圍是:0 - 255
(255, 255, 255) - 白色
(0, 0, 0) - 黑色
(255, 0, 0) - 紅色
(0, 255, 0) - 綠色
(0, 0, 255) - 藍(lán)色
window.fill((150, 50, 50))
將窗口展示到屏幕上
pygame.display.flip()
3.創(chuàng)建游戲循環(huán)(死循環(huán))
while True:
# 4.檢測(cè)事件
for event in pygame.event.get():
# 1.區(qū)分不同的事件次哈,做出不一樣的反應(yīng)
# 判斷關(guān)閉按鈕點(diǎn)擊事件是否發(fā)生
if event.type == pygame.QUIT:
exit()
5.在窗口上顯示圖片
import pygame
pygame.init()
顯示圖片
1.加載圖片
pygame.image.load(圖片地址) - 加載指定路徑下的圖片返回一個(gè)圖片對(duì)象
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(渲染對(duì)象, 渲染位置)
渲染對(duì)象 - 圖片對(duì)象(顯示什么)
渲染位置 - 元組胎署,(x, y)
window.blit(image_obj, (200, 200))
3.獲取圖片的大小
圖片對(duì)象.get_size() - 獲取圖片大小,返回值是一個(gè)元組窑滞,(width,height)
4.圖片縮放和旋轉(zhuǎn)
a.縮放
pygame.transform.scale(圖片對(duì)象. 大小) - 將指定的圖片縮放到指定的大小
new_image = pygame.transform.scale(image_obj, (100, 250))
# window.blit(new_image, (10, 300))
b.旋轉(zhuǎn)縮放
pygame.transform.rotozoom(圖片對(duì)象, 旋轉(zhuǎn)角度, 縮放比例)
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.創(chuàng)建字體對(duì)象
a.系統(tǒng)字體
pygame.font.SysFont(字體名, 字體大小, bold(是否加粗)=False, italic(是否傾斜)=False) - 返回字體對(duì)象
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.根據(jù)字體創(chuàng)建文字對(duì)象
render(文字內(nèi)容, 是否平滑, 文字顏色)
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(畫在哪里, 線的顏色, 起點(diǎn), 終點(diǎn), 線寬=1)
pygame.draw.line(window, Color.green, (0, 0), (100, 100), 10)
lines(畫在哪里, 線的顏色, 是否閉合, 點(diǎn)列表, 線寬)
依次連接點(diǎn)列表中所有的點(diǎn),是否閉合決定是否連接起點(diǎn)和終點(diǎn)
points = [(110, 160), (150, 110), (200, 200), (500, 400), (300, 300)]
pygame.draw.lines(window, Color.green, False, points)
2.畫圓
circle(畫在哪里, 線的顏色, 圓心坐標(biāo), 半徑, 線寬=0)
pygame.draw.circle(window, Color.red, (600, 200), 100, 1)
3.畫弧線
arc(畫在哪里, 線的顏色, 矩形, 起始弧度, 終止弧度, 線寬=1)
矩形 - (x, y, width, height) x,y決定矩形左上角的坐標(biāo),后面決定矩形的寬和高
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(畫在哪里, 線的顏色, 點(diǎn)列表, 線寬=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()