2019-05-07

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就会销毁。

你可能感兴趣的:(2019-05-07)