Day16.png
1 重载运算符
python中所有的数据类型都是类,数据都是对象;所有的运算符对应的操作,本质都是在调用数据类型对应的魔法方法,每个运算符都对应一个固定的魔法方法。
class Student(object):
def __init__(self, name, age=0, score=0):
self.name = name
self.age = age
self.score = score
def __add__(self, other):
return self.age + other.age
def __gt__(self, other):
return self.score > other.score
# 比较相同属性时,>和<只需要重载一个
stu1 = Student('小明', 18, 60)
stu2 = Student('小花', 22, 80)
print(stu1 + stu2)
print(stu1 > stu2)
# 练习让student的对象支持乘法运算,运算规则是:
# <name:张三,age:10,score:0> * 3 = [<name:张三,age:10,score:0>,<name:张三,age:10,score:0>,<name:张三,age:10,score:0>]
class Student(object):
def __init__(self, name='张三', age=10, score=0):
self.name = name
self.age = age
self.score = score
def __repr__(self):
return '<' + str(self.__dict__)[1:-1] + '>'
def __mul__(self, other):
list1 = []
for i in range(other):
list1.append(self)
return list1
s1 = Student()
result = s1 * 3
print(result)
s1.name = '小明'
print(result) # 改变属性后,列表内容随之改变
2、深拷贝和浅拷贝
一个变量直接给另一个变量赋值,直接将地址赋值,赋完后,两个变量指向一个内存区域,并且相互影响.
拷贝原理:将被拷贝的对象复制一份,产生一个新的数据,再将新数据的地址返回
2.1 浅拷贝
a.列表或字典的copy方法时浅拷贝、切片也是浅拷贝
b.copy.copy(对象) -- 复制指定的对象,产生一个新的对象
2.2 深拷贝
copy.deepcopy(对象) -- 复制指定的对象,产生一个新的对象。如果这个对象中有其他的对象,子对象也会被复制。
import copy # 拷贝前需导入copy模块
stu2 = Student('Lisa', 18, 60)
stu4 = copy.copy(stu2)
stu2.name = 'Sara'
print(stu2, stu4)
3 内存管理机制
3.1 数据的储存
python的内存空间也可以分为栈区间和堆区间。
变量(包括函数调用过程中的变量)都储存在栈区间,对象都储存在堆区间。
声明变量或给变量赋值,是先在内存(堆)中开辟存储数据,然后将数据地址保存在变量中。
但是数字和字符串特殊,如果是用数字或者字符串给变量赋值,不会直接开辟空间保存数据,而是现在内存检测这个数据之前是否已经储存过,如果已经存储直接用上次保存的数据,没有存储才会开辟新的空间保存数据。
list1 = [1,2]
list2 = [1,2]
print(id(list1), id(list2))
a = 10
b = copy.deepcopy(a) # 即使使用copy方法,地址还是一样
print(id(a), id(b))
c = 'abc'
d = 'abc'
print(id(c), id(d))
3.2 内存的释放
python中每个对象都有一个熟悉叫引用计数,用来保存当前对象的引用个数。
python中的垃圾回收机制来判断一个对象是否销毁,就看这个对象的引用计数是否为零,如果为零就会被销毁