1.类的继承
python中支持类的继承,并且支持多继承
1.什么是继承
父类(超类):被继承的类
子类:去继承父类的类继承就是直接让子类拥有父类的属性和方法。
python中所有的类都是直接或者间接的继承自object
2.怎么继承
class 类名(父类):
class 类名 : 就是 class类名(object)
3.能继承那些东西
对象属性,对象方法,类的字段,静态方法,类的方法
如果设置了__slots__
会约束当前类的对象属性,还会影响到 对象.dict的生成,子类继承父类后 对象属性不会受影响,但是 对象.dict只会显示子类的对象属性`
class Person:
num = 61
def __init__(self,name = 'nihao', age = 12 ):
self.name = name
self.age = age
def eat(self,food:str):
print('%s再吃%s' %(self.name, food))
@staticmethod
def func1():
print('谁在吃饭')
@classmethod
def show_num(cls):
print('人类数量%d' % (cls.num))
class Student(Person):
pass
2.重写
继承父类后,子类会拥有父类的属性和方法,也可以添加自己的属性和方法
1.添加新的方法
直接在子类中声明,新的方法只能通过子类来使用。
2.重写
a.子类继承父类的方法,想要全部改写这个方法的功能,直接重新声明。------完全重写(子类的方法会覆盖父类的方法)
b.在子类中通过 super().父类方法 去保存父类对应的功能方法,然后在下面添加子类要更新的东西, 这样 通过子类 父类的方法功能都可使用。
3.类中函数的调用过程
类.方法()
对象.方法()
先看当前类是否有这种方法,如果有就直接调用当前类中相应的方法,
如果没有,就去当前类的父类中去看看有没有这个方法,如果有就调用父类的这个方法,
如果父类中没有这个方法,就去找父类的父类中去找,依次类推直到找到为止。
如果找到基类object,还没有找到这个方法,程序才会报错
class Person:
def __init__(self):
self.name = ""
def eat(self,food):
print('%s吃%s' % (self.name,food))
@staticmethod
def run():
print('步')
@classmethod
def get_up(cls):
print('洗漱')
print('换衣服')
class Student(Person):
def study(self):
print('%s学习'%(self.name))
@ staticmethod
def run():
print('学生在跑步')
@classmethod
def get_up(cls):
# super() --> 获取当前类的父类
# super().get_up() --> 调用父类的get_uo方法
super().get_up() # 可以保留父类get_up()功能
print('背书包')
4.添加属性
1.子类中添加类的字段
直接添加
2.子类中添加对象属性
在子类的init下面加
def __init__():
super().__init__(父类未赋值的形参)
新的对象属性
class Car:
def __init__(self,name ,color):
self.name = name
self.color = color
class Ato(Car):
def __init__(self,jiage,name,color):
super().__init__(name,color)
self.jiage = jiage
car = Ato('12','niah','bu')
print(car.name)
setattr(car, 'color','黑色')
print(car.color)
5.运算符重载
运算符重载:
通过实现类相应的魔法方法,来让类的对象支持相应的运算符(+,-,*,/,>...)
import copy
class Dog:
def __init__(self,name,age,color):
self.name = name
self.age =age
self.color = color
def __gt__(self, other):
return self.age > other.age
def __mul__(self, other:int):
list1 = []
a = self.__dict__
for x in range(other):
list1.append(copy.copy(a))
return list1
dog1 = Dog('阿黄', 78,'黄色')
dog2 = Dog('小黄',34,'黑色')
print(dog1 < dog2)
print(dog1 * 4)
6
python 中的内存管理 ---> 自动管理 ---> 垃圾回收机制
内存结构中分栈区间和堆区间,栈区间中的内存是系统自动开辟自动释放,堆区间中的内存
需要手动申请,手动释放,
但是绝大部分编程语言,都提供了一套属于自己的关于堆中的内存管理方案
---- python中的垃圾回收机制是管理堆区间内存释放的
----python中的数据都是存在堆中的,数据的地址都是在栈区间,
1.内存的开辟
python中将值赋给变量的时候,会先在堆中开辟空间将数据存起来,然后将地址返回给变量
,存在栈中。
python中如果数据是数字和字符串,会现在缓存区查看这个数据之前是否已经创建过,如果没有
就去创建空间存数据,将地址返回给变量,存在栈中,如果之前已经创建过就直接将之前地址返回
2.内存的释放---> 垃圾回收机制
系统每隔一定时间就会去检测当前程序所有的对象的引用计数值是否为0,
如果对象的引用计数是0,对象对应的内存就会被销毁,如果不是0就不会销毁
3.引用计数
每一个对象都有引用计数属性,用来存储当前对象呗引用的次数。
可以通过sys模块中的getrefcount取获取一个对象的引用计数值
4.增加引用计数:增加引用(增加保存当前对象地址的个数)
减少引用计数: a.删除存储对象地址的变量 b.修改存储对象地址变量的值