语言分类
面向机器
抽象成机器指令,让机器容易理解
代表:汇编语言
面向过程
按照步骤一步一步走,若出现情况A做相应的处理,若出现情况B做相应的处理
问题规模小,可以步骤化,按部就班处理
代表:C
面向对象OOP
计算机需要处理的问题的规模越来越大,需要多人、多部门协作
代表:C++、Java、Python
面向对象
一种认识世界、分析世界的方法论。将万事万物抽象成类
类class
抽象的概念,世间万物的抽象,是一类事物的共同特征的集合
用计算机语言来描述类——属性和方法的集合
对象instance、object
对象是类的具象,是一个实体
每个人个体都是抽象概念人类的不同的实体
属性:是对象状态的抽象,用数据结构来描述
操作:是对象行为的抽象,用操作名和实现该操作的方法类描述
哲学思想
一切皆对象
对象是数据和操作的封装
对象是独立的,但相互之间可以相互操作
目前OOP是最接近人类认知的编程范式
面向对象的3要素
封装
组装:将数据和操作结合在一起
隐藏数据:对外只暴露一些接口,通过接口来访问对象
继承
多复用,继承来的不用在重复写
多继承少修改,OCP(Open-Closed Principle),使用继承来改变和体现个性
多态
动态绑定,面向对象编程最灵活的地方
Python的类
定义
class ClassName:
语句块
使用class关键字
类名必须使用大驼峰
类定义完成后,就产生一个类对象,绑定到标识符ClassName上
类对象及类属性
类对象:类的定义即会生成一个类对象
类的属性:类定义中的变量和方法都是类的属性
类变量:x即为MyClass的变量
foo方法是类的属性,只有实例才能调用
Foo是方法对象method,不再是普通的函数对象function,一般要求至少有一个参数,第一个参数可以是self,self指代当前实例本身
实例化
a = MyClass()
在类对象名称后面加上一个括号,就调用类的实例化方法,完成实例化
实例化创建一个该类的对象(实例)
每次实例化后获得的实例都是不同的实例,即使使用相同的参数实例化,也得到不一样的对象
Python类实例化后,会自动调用__init__方法,该方法将第一个参数必须留给self,其他参数任意
__init__方法
MyClass实际调用的是__init__(self)方法,可不定义,若没有定义会在实例化后隐式调用
__init__()方法不能有返回值,只能是None
作用:对实例进行初始化
初始化函数可以有多个参数,但第一个位置必须是self
实例对象instance
类实例化后一定会获得一个对象——实例对象
__init__方法的第一个参数self就是指代某一个实例
类实例化后,得到一个实例化对象,实例化对象会绑定方法
方法的调用者会被作为第一个参数self的实参传入
self.name就是bob对象的name,name保存在bob对象上,而非Person类上,称为实例变量
self
self就是调用者,就是c对应的实例对象
self仅为惯例,可以修改为其他名称,一般不做修改以保证代码的可读性
实例变量和类变量
实例变量是每一个实例自己的变量,是自己独有的;类变量是类的变量,是类的所有实例共享的属性和方法
特殊属性
含义
__name__
对象名
__class__
对象的类型
__dict__
对象的属性的字典
__qualname__
类的限定名
python中每一种对象都拥有不同的属性,函数、类都为对象,类的实例也是对象
类属性保存在类的__dict__中,实例属性保存在实例的__dict__中,借助__class__找到实例所属的类可以实现从实例访问类的属性
总结
变量是类的,也是这个类所有实例的,其实例都可以访问到;变量是实例的,通过类无法访问到
类变量是属于类的变量,这个类的所有实例可以共享该变量
实例可以动态的为自己增加一个属性,instance.__dict__[变量名]和instance.变量名都可以访问到
实例的同名变量会隐藏这个类变量,即覆盖了该类变量
类变量使用全大写来命名
实例属性的查找顺序
实例通过.来访问属性,会先查找自己的__dict__,若没有则通过属性__class__找到自己的类,再到类的__dict__中查找
实例使用__dict__[变量名]访问变量,则不会查找类中的属性
类的装饰
装饰的本质就是为;类对象动态的添加一个属性
类方法和静态方法
普通函数
无参函数在定义时没有指定self,不能完成实例对象的绑定,无法使用
类方法
在类定义中,使用@classmethod装饰器装饰的方法
必须至少一个参数,且第一个参数留给cls,cls指代调用者即类对象自身
cls可为任意其他字符串,不建议修改保证可读性
通过cls可以直接操作类的属性
静态方法
在类定义中,使用@staticmethod装饰器装饰的方法
调用时不会隐式传入诸如self、cls之类的参数
静态方法,只是表明该方法属于这个名词空间,函数放在一起方便组织和管理
方法的调用
类几乎可以调用内部定义的所有方法,但是调用普通方法时会报错,原因是必须有self参数
实例几乎可以调用所有的方法,普通函数的调用一般不使用,不允许该种定义
总结
类除了普通方法都可以调用,普通方法需要对象的实例作为第一个参数
实例可以调用所有类中定义的方法(包括classmethod、staticmethod),普通方法传入实例自身,静态方法和类方法需要找到实例的类
访问控制
私有(private)属性
使用双下划线开头的属性名
外部无法访问__age
可使用方法来访问
私有变量的本质
类定义的时候,如果使用双下划线开头声明一个实例变量,Python解释器会将其改名,转换为_类名__变量名 的名称
可是使用私有变量特定格式的名称从外部访问私有变量,并修改它
保护变量
在变量名前使用一个下划线
并未改变名称,和普通属性一样,解释器不做任何特殊处理
只是一种约定,提示开发者不要直接使用该变量
私有方法
和保护变量、私有变量一样使用单下划线、双下划线命名的方法
本质
单下划线的方法只是开发者的约定,解释器不做任何修改
双下划线的方法是私有方法,解释器会改名,_类名__方法名,,保存在类的__dict__中
属性装饰器
好的设计:将实例的属性保护起来,不让外部直接访问,外部使用getter和setter读取或设置属性
使用property装饰器时者三个方法同名
property装饰器:后面跟的函数名就是以后的属性名,即是getter,这个必须有,有了它至少是只读属性
setter装饰器:与属性名同名,且接收2个参数,第一个为self,第二个为要赋值的值,有了它,属性可写
deleter装饰器:可以将属性删除,很少用
property必须在前,setter、deleter在后
property通过简单的方式,将对方法的操作变成对属性的访问,并起到一定的隐藏效果
原创文章,作者:ZBD20,如若转载,请注明出处:http://www.178linux.com/97655