day16-总结 内存管理和拷贝
-
1.多继承
- python中的类支持多继承(让一个类同时继承多个类)
- 多继承的时候,子类只能继承第一个父类所有的对象属性和方法,后面的父类只能继承字段和方法
class Animal(object):
num = 100
def __init__(self):
self.age = 0
self.gender = '雄'
@classmethod
def func1(cls):
print('动物的类方法')
class Fly(object):
name = '飞行器'
def __init__(self):
self.height = 100
self.time = 2
self.speed = 150
def func2(self):
print('飞行的对象方法')
class Bird(Animal, Fly):
pass
bird1 = Bird()
print(Bird.name, Bird.num) # 飞行器 100
bird1.func1() # 动物的类方法
bird1.func2() # 飞行的对象方法
-
运算符重载
- 1.运算符
python中所有的类型都是类,所有的数据都是对象;
python中使用所有的运算符都是在调用类中相应的方法,每一个运算符对应什么方法是固定的
某种数据是否支持某种运算符操作就看这个数据类型是否实现了对应的方法
- 2.运算符重载是指在不同的类中实现同样的运算符对应的函数
类的对象默认只支持:==, !=
注意:< 和 > 符号只需重载一个就可以了
深拷贝和浅拷贝
- 1.直接赋值
直接赋值就是将变量中的地址赋给新的变量;复制后两个变量的地址一样
(全变)
- 2.拷贝
不管深拷贝还是浅拷贝,都会对原数据进行赋值产生新的地址
- 3.浅拷贝
字符串、列表和元组的切片;对象.copy();copy模块中的copy方法都是浅拷贝
浅拷贝只拷贝当前对象,不拷贝子对象
(子对象改变,其他不变)
- 4.深拷贝
copy模块中的deepcopy方法就是深拷贝
(全部不变)
# 练习:
a = ['color', 'height', 'background']
b = [a, 'aaa', 'bbb']
c1 = b
c2 = copy(b)
c3 = deepcopy(b)
a[-1] = ['BG']
b.append('ccc')
# b = [['color', 'height', 'background'], 'aaa', 'bbb']
# 问题:print(c1), print(c2), print(c3)
print(c1) # [['color', 'height', ['BG']], 'aaa', 'bbb', 'ccc'] (全部改变)
print(c2) # [['color', 'height', ['BG']], 'aaa', 'bbb'] (子对象改变,其他不变)
print(c3) # [['color', 'height', 'background'], 'aaa', 'bbb'] (全部不变)
枚举
from enum import Enum, unique
枚举值的特点:
1.可以通过有意义的属性名直接显示数据
2.每个数据的值不能修改
3.可以做到不同的数据的值唯一(加上@unique)
内存管理
-
1.内存开辟
内存区间分为栈区间和堆区间;
栈区间的内存自动开辟自动释放;
堆区间的内存需要程序员手动开辟和释放;
但是python中已经将堆区间内存的开辟和释放自动化
a. 当每次给变量赋值的时候,系统会先在堆区间开辟空间将数据存起来,再将数据在堆区间对应的地址存在变量中,变量在栈区间中。
b. 数字和字符串数据在开辟空间的时候,会先检查内存中之前是否有这个数据,如果有,直接使用之前的数据,没有就重新开辟保存。
-
2.内存的释放
栈区间:全局栈区间在程序结束后销毁,函数栈区间在函数调用结束的时候销毁(自动)。
堆区间:看一个对象是否销毁,就看这个对象的引用计数是否是0,是0就销毁,反之不销毁。(垃圾回收机制)
注意:python中针对对象的循环引用已经做了处理,程序员不需要写其他额外代码来解决循环引用问题。