世界万物,皆有类别。神灵开始以手工方式创造生命,时间久了觉得很麻烦,思考着能不能让生命自己繁殖。后来发明了OOP思想建立了各种类型,实现了对宇宙系统的描述。
世界万物,皆为对象。通过对类的实例化而生成了各个类的对象,构成了这个丰富多彩的实体世界。
世界万物,皆有属性。对象均有各种属性,颜色、形状、技能等。
什么是Class 类
类是对一组具有相同属性的对象的抽象。通过建立模型,可以避免多次重复制造对象。
什么是Object 对象
对象是对类进行实例化后的实例,一个类可以实例化许多对象。每个对象可以有自己不同的属性。
面向对象的三大特征
封装
把对象封装起来,起到一定的抽象、美观、保护作用。比如:动物
继承
生命繁殖,继承了父母的基因特性,具有一定的血缘关系。子类对象可以使用父类方法,也可以重构父类的方法和构造函数,父类构造函数的参数不能省略。还可以先执行父类的同名方法之后在调用自己的方法。
调用父类方法一:父类名.父类方法名(self)
方法二:super(子类名,self). _ _init_ _(父类参数) 这种方法适用于不知道父类名或者父类名修改的情况
经典类与新式类区别
class 父类名: 经典类写法
class 父类名(object):新式类写法
经典类和新式类的主要区别是在多继承上,
多继承:python支持多继承,一个子类可以继承多个父类,也可以重构父类方法。先继承谁,后继承谁是有顺序的。
多态
通过相同的接口,不同的对象执行同一指令。实现多种形态效果。
例子:
1 class Cat: 2 def call(self): 3 print("miao miao") 4 5 cat1=Cat() 6 cat2=Cat() 7 8 cat1.call() 9 cat2.call()
面向对象编程的好处: 1.减少重复代码 2.便于后期代码修改、扩展、维护。
类的实例化原理剖析
实例化就是把一个类生成具体对象的过程。变量名=类名(self对象名,类的属性参数)self:是实例变量,告诉构造函数引用的是堆中的哪个对象的内存地址。
内存堆与栈的区别:
什么是栈?
栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。
什么是堆?
堆内存:存储的是数组和对象(其实数组就是对象),凡是实例化建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,堆里的实体虽然不会被释放,但是会被当成垃圾,有垃圾回收机制不定时的收取。
堆栈分配原理
比如主函数里的语句 int [] arr=new int [3];在内存中是怎么被定义的:
主函数先进栈,在栈中定义一个变量arr,接下来为arr赋值,但是右边不是一个具体值,是一个实体。实体创建在堆里,在堆里首先开辟一个空间,内存在存储数据的时候都是通过地址来体现的,地址是一块连续的二进制,然后给这个实体分配一个内存地址。数组都是有一个索引,数组这个实体在堆内存中产生之后每一个空间都会进行默认的初始化(这是堆内存的特点,未初始化的数据是不能用的,但在堆里是可以用的,因为初始化过了,但是在栈里没有),不同的类型初始化的值不一样。所以堆和栈里就创建了变量和实体:
【如图一】

堆和栈如何关联?
把堆的地址赋给arr,arr就通过地址指向了数组。所以arr想操纵数组时,就通过这个地址,而不是直接把实体都赋给它。这种我们不再叫他基本数据类型,而叫引用数据类型。称为arr引用了堆内存当中的实体。
【如图二】

构造函数
实例化时,对类属性进行初始化赋值操作。
类变量与实例变量
实例自己的变量优先于类的变量,实例不能修改类的变量。构造函数中是多个实例共同具有的属性,类变量是不需要创建每个对象的时候,都在堆中建立的属性,有一个类变量就可以了,以节省内存。
实例化属性
实例的属性,即可以构造时赋值,也可以在构造之后增、删、改。 del 对象名.属性
析构函数
与构造函数相反,在实例释放或者销毁的时候自动执行的函数。
1 def __del__(self): 2 3 print("the object die") 4 5 del object
垃圾回收机制
Python是门解释性语言,实例的回收原则是根据变量名的存在与否而判断是否回收。
私有属性、私有方法
私有属性: _ _属性名 需要通过类的方法访问
私有方法:_ _方法名
浙公网安备 33010602011771号