一、多继承
1、多继承
多继承:就是让一个类同时继承多个类
注意:实际开发的时候,一般不使用多继承
2、多态
类的特点:封装、继承、多态
封装:可以对多条数据(属性)和多个功能(方法)进行封装
继承:可以让一个类拥有另外一个类的属性和方法
多态:有继承就有多态(一个事物的多种形态) 类的重写也是多态
二、运算符重载
1、别的语言的函数和函数的重载
C++/java声明函数的语法:
返回值类型 函数名(参数列表){
函数体
}
int func1(){
}
int func1(int a){
}
int func1(char a){
}
int func1(int a, int b){
}
上面4个函数式不同的函数(可以同时存在);
Python中的函数不支持重载(Python中的函数式变量)
def func1():
pass
def func1(a):
pass
def func1(a, b):
pass
最终只保留最后这一个func1,前面的会被覆盖
2、运算符重载
Python中使用运算符的时候,实质是在调用相应的魔法方法(Python中每个运算符都对应一个魔法方法)
运算符重载:在不同的类中实现同一个运算符对应的魔法方法,来让类的对象支持相应的运算
+ 重载:
数据1 + 数据2 -> 数据1会传给self 数据2会传给other
注意:比较运算中 大于和小于 一般情况下只需要重载一个 另外一个自动支持
例如:
class Student(object):
def __init__(self, name='', score=0, age=0):
self.name = name
self.score = score
self.age = age
# 加法运算符的重载
def __add__(self, other):
# self + other
return self.score + other.score
# 减法运算符的重载
def __sub__(self, other):
# self - other
return self.age - other.age
# 小于运算的重载
def __lt__(self, other):
return self.score < other.score
def __repr__(self):
return '<' + (str(self.__dict__)[1:-1]) + '>'
stu1 = Student('小花', 90, 16)
stu2 = Student('小明', 80, 18)
stu3 = Student('小红', 75, 22)
stu4 = Student('小方', 40, 11)
print(stu1 + stu2)
print(stu2 - stu1)
list_student = [stu1, stu2, stu3, stu4]
list_student.sort()
print(list_student)
print(max(list_student))
三、内存管理机制
1、堆和栈
内存区域里面分为堆区间和栈区间:栈区间的内存的开辟和释放是自动的,堆区间的内存是手动开辟手动释放的;内存管理管理的是堆区间的内存。
2、数据的存储
- a.Python中所有的数据都是对象 都是保存在堆中的
- b.Python中所有的变量存储的都是存在堆中的数据的地址 存了对象的地址的变量又叫对象的引用
- c.默认情况下创建对象就会在堆中去开辟空间,存储数据,并且将这个地址返回; 如果对象是数字、字符串,会做缓存,而且每次使用的时候会先去缓存中看之前有没有存过, 如果有就直接返回之前的数据的地址,没有才开辟新的空间存储数据。
3、数据的销毁
Python中通过“垃圾回收机制”来管理内存的释放。
- 原理:看一个对象(数据)是否销毁,就看这儿对象的引用计数是否为0,为0就销毁,不为0就不销毁
- 引用计数:对象的引用个数
- a.增加引用计数:使用变量存对象的地址
from sys import getrefcount
getrefcount(对象) - 回去指定对象的引用计数 - b.减少引用计数:删除引用,或让当前对象的引用成为别的对象的引用