python中所有的数据类型都是类,数据都是对象
所有的运算符对应的操作,本质都是在调用数据类型对应的魔法方法。
每个运算符都对应一个魔法方法。
class Student:
def __init__(self,name,age=0,score=0):
self.name = name
self.age = age
self.score = score
# def __str__(self):
# return str(self.__dict__)
def __repr__(self):
return str(self.__dict__)
# 重载加法运算符
# self + other = return 返回值
def __add__(self, other):
return self.age + other
# 重载乘法
def __mul__(self, other:int):
return [(self.name, self.score , self.age)]*3
# [(self.name:name), (self.score:score), (self.age:age)] * other
# 大小运算符(>和<只需重载一个),只重载一个,另一个自动可以使用。
s1 = Student('H',20,60)
s2 = Student('O',17,90)
# 练习:让Student的对象支持乘法运算,运算规则是:
# s1 * 3
print(s1*3)
# print(s1)
1.一个变量直接给另外一个变量赋值:
直接将地址赋值,赋完后两个变量指向同一块内存区域,并且相互影响。
is 判断地址是否相同
2.浅拷贝和深拷贝(面试点)
拷贝原理:将被拷贝的对象复制一份,产生一个新的数据,然后将新的数据的地址返回。
1)列表或者字典的copy方法是浅拷贝、切片也是浅拷贝
2)浅拷贝:copy.copy(对象) -- 复制指定对象,产生一个新的对象 # 使用前import copy
3)深拷贝:copy.deepcopy(对象)
复制指定的对象,产生一个新的对象。如果这个对象中有其他子对象,这个子对象也会被复制。
数据的存储(内存的开辟)
python的变量都储存在栈区间,对象都在堆区间。
声明变量或者给变量赋值,是先在内存(堆)中开辟存储数据,
然后将数据地址保存在地址中。
但是数字和字符串特殊,如果是用数字或者字符串给变量赋值,
不会直接开辟空间,先在内存中检查这个数据是否已经存储过;
如果已经存储直接用上次保存的数据;如果没有保存过,
才开辟新的空间保存数据
2、内存的释放
1)引用计数
python每个对象都有一个属性叫引用计数,用来保存当前对象的引用的个数;
2)python中的垃圾回收机制来判断一个对象是否销毁,
就看这个对象引用计数是否为0,如果为0就会销毁。
网友评论