众所周知,面向过程:根据业务逻辑从上到下写代码。面向对象:将数据与函数绑定到一起,进行封装,这样能更快速的开发程序,减少了重复代码的重写过程。面向对象语言三个基本要素:封装 继承 多态把函数和全局变量和在一起就是封装。而python就属于面向对象的语言。
类和对象的概念
类与对象的关系和区别:类是抽象的概念,仅仅代表事物的模板。对象是一个能够看得到,摸得着的具体的实体比如:飞机是对象,飞机图纸是类。
类由三部分构成:
类的名称:类名
类的属性:一组数据
一个特殊的对象:能够知道这个对象的class.
类的方法:允许进行的操作
类的抽象:拥有相同或者类似属性和行为的对象都可以抽象出一个类
类的属性
python调用__init__方法的作用:初始化对象
python调用__str__方法:
私有方法:外界不能直接调用
私有属性:可以添加,可以添加后取值,不可以直接取值。(以双下划线开头为私有变量,单下划线开头的为保护变量)
通过内部方法取值:
私有属性无法取值的原因是因为名字重整技术,其实可以通过_类名_属性可以访问:
在这里讲一下私有的原理:这是通过名字重整机制改变的。命名规则:_类名__num(尽量不要用)
python可以自己调用__del__方法,__del__是该对象被删除后调用的方法,注意:这里的删除是没有引用对象
完全删除后(没有引用对象):
测量对象的引用对象:用sys模块的sys.getrefcount,得出结果后减一。
__new__方法:创建对象
实例化对象相当于做三件事:
1.通过__init__来创建对象,然后找了一个变量来接收__init__的返回值。这个返回值表示创建出来的对象引用。
2.__init__(刚刚创建出来的对象的引用)
3.返回对象的引用。
__new__方法 和 __init__方法的区别:
1.__init__ 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。没有返回值。负责初始化
2.__new__ 通常用于控制生成一个新实例的过程。它是类级别的方法,参数是cls。负责创建。__init__和__new__方法合起来相当于C++的构造函数。
下面讲一个新的概念:单例 单例是创建了多少个对象都是指向同一片内存。
只初始化一次对象:
继承
继承:可以少写代码。继承父类的方法和属性
继承可以多类继承。当子类和父类有什么不同时,可以进行重写(在子类中写一个和父类方法名相同的方法进行不同操作)
私有方法,私有属性不能被继承,可以被间接调用,如果在子类中实现了一个公有方法调用的方法或属性,那么这个方法是不能调用继承的父类的私有方法和私有属性
多继承:
当子类中的方法和父类方法名一样时会按照以下顺序去进行执行:
子类调用父类的三种方法:
父类.方法
super().init(不用传self,传参数)
super(父类,self).init(不传self,参数)可以根据父类指定调用哪一个父类
多态:在写完方法的时候并不知道调用的是什么方法。真正执行的时候才知道
类、实例、静态
类在程序中也属于一个对象,称之为类对象。通过类创建出来的对象称之为实例对象。
类属性(classmethod):类对象里的属性
实例属性:实例对象里的属性
实例属性和类属性的区别:实例属性和具体的某个实例对象有关系,且一个实例对象和另外一个实例对象是不共享属性的。类属性属于类对象,并且多个实例对象共享同一个类属性。
实例方法和类方法:
静态方法:
实例方法、类方法和静态方法的区别:实例方法和类方法必须传一个参数(实例方法self用来接收对象,类方法cls用于接收类),静态方法不需要参数(可以有)。
动态添加属性和方法
添加实例方法
注意:通过对象名添加的对象方法,只有这个对象能用
添加静态方法
1 | class Person(object): |
注意:通过类名添加的静态方法,这个类以及这个类的所有对象都能使用
添加类方法
1 | class Person(object): |
注意:通过类名添加的类方法,这个类以及这个类的所有对象都能使用
限制添加
slots可以限制添加属性:这可以告诉解释器这个类的所有实例属性都在这了。可以节省大量内存。每个子类都要定义slots属性,因为解释器会忽略继承的slots属性。方法也可以进行限制
内建属性:
getattribute:属性拦截器
使用类名调用类属性时,不会经过__getattribute__方法,其他均要调用。(可以用来做日志)