面向对象:
一种认识世界,分析世界的方法论,将万事万物抽象为类
类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合,用计算机语言来描述类,就是属性和方法的集合
属性:它是对象状态的抽象,用数据结构来描述;
操作:它是对象行为的抽象,用操作名和实现该操作的方法来描述
一切皆对象,对象是数据和操作的封装
面向对象三要素:
1、封装:将数据和操作组装到一起,对外只暴露一些接口,通过接口访问对象。
2、继承:多继承少修改,使用继承来改变,来体现个性
3、多态:继承和复用
定义:
__init__()方法的第一个参数self就是指代某一个实例,该方法不能有返回值,也就是只能是None
类实例化后,得到一个实例对象,实例对象会绑定方法,调用方法时采用tom.show()的方式,其中的self就是tom,python会把方法的调用者作为第一参数self的实参传入,self.name就是tom对象的name,name是保存在了tom对象上,而不是Person类上,称为实例变量
实例变量是每一个实例自己的变量,是自己独有的;类变量是类的变量,是类的所有实例共享的属性和方法
类属性保存在类的__dict__中,实例属性保存在实例的__dict__中,从实例访问类的属性,就需要借助__class__找到所属的类,如:tom.__class__.__dict__
是类的,也是这个类所有实例的,其实例都可以访问到;是实例的,就是这个实例自己的,通过类访问不到;类变量是属于类的变量,这个类的所有实例可以共享这个变量;实例可以动态的给自己增加一个属性,实例.__dict__[变量名] 和 实例.变量名 都可以访问到到
一般,类变量使用全大写来命名
装饰一个类:为一个类通过装饰,增加一些类的属性
只所以能够装饰,本质上是为类对象动态的添加了一个属性,而Person这个标识符指向这个类对象
类方法:
1、在类定义中,使用@classmethod装饰器修饰的方法
2、必须至少有一个参数,且第一个参数留给了cls,cls指代调用者即类对象本身
3、通过cls可以直接操作类的属性
静态方法:
1、在类定义中,使用@staticmethod装饰器修饰的方法
2、调用时,不会隐式的传入参数,静态方法只是表明这个方法属于这个名词空间,函数归在一起,方便组织管理。
私有变量:使用双下划线开头的属性名,就是私有属性
私有变量的本质:类定义的时候,如果声明一个实例变量的时候,使用双下划线,python解释器会将其改名,转换名称为 _类名__变量名 的名称,所以用原来的名字访问不到,若要访问这个私有变量,需要定义方法getage(),使用方法来访问
如上例中,可以使用p1._Person__age来对私有变量进行访问和修改
保护变量:在变量名前使用一个下划线,称为保护变量
可以看出,这个_age属性根本就没有改变名称,和普通属性一样,解释器不做任何处理,是一种约定,看到这种变量,就如同私有变量,不要直接使用
私有方法:参照保护变量,私有变量,使用单下划线和双下划线命名的方法
单下划线的方法只是开发者之间的约定,解释器不会做任何改变;双下划线的方法,是私有方法,解释器会改名,改名策略和私有变量相同,_类名__方法名,方法和变量都在类的__dict__中可以找到
补丁:可以通过修改或者替换类的成员,使用者调用的方式没有改变,但是,类提供的功能可能已经改变了
猴子补丁:
在运行时,对属性、方法、函数等进行动态替换,其目的是为了通过替换、修改来增强、扩展原有代码的能力。
属性装饰器:一般好的设计是把实例的属性保护起来,不让外部直接访问,外部使用getter读取属性和setter设置属性
使用property装饰器的时候三个方法同名
property装饰器:后面跟的函数名就是以后的属性名,它就是getter,这个必须有,有了它至少是可读属性
setter装饰器:与属性名同名,且接收两个参数,第一个是self,第二个是将要赋的值,有了它,属性可写
delter装饰器:可以控制是否删除属性。很少用
property装饰器必须在前,setter,delter装饰器在后
对象的销毁:
类中可以定义__del__方法,称为析构函数(方法)
作用:销毁类的实例的时候调用,以释放占用的资源,其中就放些清理资源的代码,比如释放连接。
这个方法不能引起对象的真正的销毁,只是对象销毁的时候会自动调用它。
使用del语句删除实例,引用计数减一,当引用计数为0时,会自动调用__del__方法,由于python实现了垃圾回收机制,不能确定对象何时执行垃圾回收。
由于垃圾回收对象销毁时,才会真正清理对象,还会在之前自动调用__del__方法,除非明确知道自己的目的,建议不要手动调用这个方法。
python不需要方法重载