面向对象是一种认识世界、分析世界的方法论,将万事万物抽象为类。
类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合,用计算机语言描述类,就是属性和方法的集合。
一切皆对象
对象是数据和操作的封装
对象是独立的,但是对象之间可以相互作用
目前OOP是最接近人类认知的编程范式
面向对象三要素
封装
组装:将数据和操作组装到一起
隐藏数据:对外只暴露一些接口,通过接口访问对象。
继承
多复用,继承来的就不用自己写了。
多继承少修改,OCP(Open-closed Principle),使用继承来改变,体现个性。
- 多态
- 面向对象变成是最灵活的地方,动态绑定。
Python的类
定义
-
必须使用class关键字
类定义完成后,就产生一个类对象,绑定到了标识符ClassName上。
类属性收class管控,获取类属性使用 “.”
-
类对象及类属性
类对象,类定义后就会生成一个类对象。
类的属性,类定义中的变量和类中定义的方法都是类的属性。
类变量,上例中x是类的变量。
foo是方法对象method,不是普通的函数对象了,它一般要求至少一个参数。第一个参数可以是
self
(self
只是个惯用标识符,可以换名字),这个参数位置就留给了self
。
实例化
在类对象后面加上一个括号,就调用类的实例化方法,完成实例化。
每次实例化后获得的实例,是不同的实例,即使是使用同样的参数实例化,也得到不一样的对象。实例化是调用
__new__
方法。python类实例化后,会自动调用
__init__
方法,这个方法的第一个参数必须留给self,其它参数随意。
__init__
方法python类实例化后,会自动调用
__init__
方法,如果没有定义,会在实例化后隐式调用。作用:对实例进行初始化。此方法不能有返回值,也就是只能
return None
。
实例对象
instance
类实例化后一定会获得一个实例对象。
实例对象会绑定方法,调用方法时采用点号调用
jerry.show_age()
,show_age()
会自动把jerry传入self中。self.name
就是jerry
对象中的name
,称为实例变量。
self
self
就是调用者,就是c
对应的实例对象。
实例变量和类变量
实例变量是每一个实例子集的变量,是自己独有的。
类变量是类的变量,是类的所有实例共享的属性和方法。
-
python中每一种对象都拥有不同的属性。函数、类都是对象,类的实例也是对象。
是类的,也是这个类所有实例的,其实例都可以访问到;实施例的,就是这个实例自己的,通过类访问不到。类变量是属于类的变量,这个类的所有实例都可以共享这个变量
对象(实例或类)可以动态的给自己增加一个属性。
实例.__dict__[变量名]和 实例.变量名
都可以访问到。实例的同名变量会隐藏掉类变量,或者说是覆盖了这个类变量。
实例属性的查找顺序
指的是实例使用
.d点号
来访问属性,会先找自己的__dict__
,如果没有,然后通过属性__class__
找到自己的类,再去类的__dict__
中找注意,如果实例使用
__dict__[变量名]
访问变量,将不会按照上面的查找顺序找变量了,这是指明使用字典的key查找,不是属性查找。- 一般来说,类变量可使用全大写来命名。
类方法和静态方法
类方法
在类定义中,使用
@classmethod
装饰器修饰的方法。必须至少有一个参数,且第一个参数留给了
cls
,cls
指代调用者即类对象自身。cls
这个标识符可以是任意合法名称,但是为了易读, 不要修改。通过
cls
可以直接操作类的属性。
静态方法
在类定义中,使用
@staticmethod
装饰器修饰的方法。调用时,不会隐式的传入参数。
静态方法,只是表明这个方法属于这个名词空间。函数归在一起,方便组织管理。
类几乎可以调用所有内部定义的方法,但是调用不带self的普通方法时会报错,原因是第一参数必须是类的实例。
实例也几乎可以调用所有的方法。
类除了普通方法都可以调用,普通方法需要对象的实例作为第一参数。
实例可以调用所有类中定义的方法(包括类方法、静态方法),普通方法传入实例自身,静态方法和类方法需要找到实例的类。