Day16——继承/内存管理

2019-01-14  本文已影响0人  Devil灬

一、__ slots __

  1. __ slots __ 的值继承后没有效果
  2. 在类中给 __ slots __ 赋值后,当前类的对象不能使用 __ dict __ ;但是这个类的子类对象可以使用 __ dict __ ,只是 __ dict __ 中没有从父类继承下来的对象属性,只有在子类中添加的对象属性
  3. 如果父类没有给 __ slots __ 赋值,直接给子类的 __ slots __ 无效

二、方法重写

  1. 完全重写
    在子类中重新实现父类的方法
  2. 部分重写
    保留父类的功能在子类中添加新的功能
    (在子类方法中通过 'super().' 的方式调用父类方法)

三、添加对象属性

对象属性其实是通过继承init方法继承下来的
格式:

super().__init__()

四、运算符重载

I. +

def __add__(self, other):
    # self和other的关系: self+other    ==> self.__add__(other)
    # 返回值就是运算结果
    
    # a.支持对象+对象:
    return self.age + other.age
    # b.支持对象+数字
    # return self.age + other

II. *

# 将other当成数字
def __mul__(self, other):
    return self.name * other

III. >

def __gt__(self, other):
    return self.score > other.score

注意:大于和小于运算符是需要重载一个就行


五、内存管理

  1. 数据的存储:
    内存分为栈区间和堆区间;
    python中变量本身是存在栈区间的,函数调用过程是在栈区间; 对象都是存在堆区间(python中所有数据都是对象)
  2. 变量赋值过程:
    先堆区间开辟空间将数据存起来, 然将数据对应的地址存到栈区间的变量中;
    数字和字符串比较特殊,赋值的时候不会直接开辟空间,而是先检测之前有没有存储过这个数据,如果有就用之前的数据的地址
  3. 内存释放(垃圾回收机制)原理:
    python中的每个对象都有一个属性叫'引用计数',表示当前对象的引用的个数。判断一个对象是否销毁就看对象的引用计数是否为0;为0的就销毁,不为0的就不销毁
  4. getrefcount函数:
    getrefcount(对象) -> 获取对象的引用计数
上一篇 下一篇

猜你喜欢

热点阅读