面向对概述与Python相关语法
面向对象概念:
面向对象是指从对象的角度出发来考虑问题,拿到需求后,对需求进行划分,以面向对象的角度思考是谁(对象),做了什么(方法)。
其中对象是类的实例,类是对象的“模板”。属于同一个类的不同对象,它们的区别是数据(实参)不同。类与类之间的区别是行为(方法/函数)不同。
面向对象的特征:
封装,继承,多态
封装:封装的目的是封装变化,将每一个可能发生变化的点(如函数,参数等)单独放到一个类中,需求变化过程中,单独对对应的类进行操作。
从数据角度讲,每个对象会包含多个数据属性,(如某个学生包含学号,姓名等数据属性),封装是将多个基本数据属性合并提取出一个自定类型(如学生类,学生类包含学号,姓名,成绩等属性)。
从行为角度讲,封装是对外提供简单必要的功能,内部隐藏实现的细节。就是说将大多数函数的执行逻辑隐藏起来,直给外部客户端代码提供必要的调用入口。
从设计角度讲:分而治之,让多个类协同完成一项任务,类的内部处理变化点,每个类处理一个变化点(高内聚),类和类的关系尽量做到互不影响(低耦合)。
继承:直观上看是重用现有类的共性,在这些共性的基础上做个性扩展(子类是在父类的基础上做个性扩展)。在开发过程中是一个自下而上的过程。先有子类,从子类中提取共同点,产生父类。继承的作用是隔离变化点。不需要改变的部分做父类,保持不变的部分,需要改变的部分做子类。使客户端代码(调用方法的代码)与实现方式(方法的具体过程)隔离开。
多态:调用父类,执行子类。比如交通工具做父类,汽车,火车,飞机等做子类,客户端在使用时直接调用交通工具类,但交通工具具体的实现方式由子类执行。
面向对象的关系:
泛化,关联,依赖
泛化关系:泛化关系在本质上就是继承关系,父类是子类的泛化,泛化关系耦合度比较高。如父类和子类的关系,子类必须根据父类的改变而改变。
关联关系:体现的是部分与整体的关系,如一个类在执行过程中,以参数的形式调用了另外一个类。(分公司与总公司之间的关系)
依赖关系:协作关系,A类依赖B类,意味着A类的某个功能依靠B类实现,如在A类中调用了B类的方法。(施工方和材料商之间的关系)
面向对象的原则:
开闭原则:增加新功能,不改客户端代码(如,父类起到中间隔离的作用,客户端使用工程中不改变父类代码,只需要在添加或修改相应的子类)
单一原则:一个类有且只有一个改变的原因。
依赖倒置:使用抽象(父类),而不用具体(子类)
组合复用:组合是指关联,使用关联关系,代替继承关系。
里氏替换:父类出现的地方,可以被子类替换,替换后保持原有功能。
迪米特法则:低耦合
面向对象相关语法:
定义类:
- 代码:
class Class_name:
“””文档说明”””
def __init__(self,参数列表):
self.实例变量 = 参数
def function(self,参数列表)
函数体
- 说明:
-- 类名所有单词首字母大写
-- __init__叫做构造函数,创建对象时被调用,也可以省略。
-- self变量绑定的是被创建的对象,名字通常叫做”self”。
创建对象:
语法:
变量 = 构造函数(参数列表)
实例变量:
语法:
-- 定义:对象地址.变量名称
-- 调用:对象地址.变量名称
实例方法:
语法:
- 定义: def 方法名称(self,参数):
方法体
- 调用:对象地址.实例方法名称(参数)
类变量:
- 语法
- 定义:在类中,方法外定义变量
class 类名:
类变量名 = 数据
- 调用:
类名.类变量名
不建议使用对象.类变量名.
- 说明
- 存储在类中。
- 只有一份,被所有对象共享,任何对象都可以对类变量进行操作,下一个对象调用的是上一个对象操作后的值。
- 描述所有对象的共有数据。
类方法:
- 语法
- 定义:
@classmethod
def 方法名称(cls,参数):
方法体
- 调用:类名.方法名(参数)
不建议使用对象.类方法名.
- 说明
- 至少有一个形参,用于绑定调用该方法的类,一般命名为” cls”。
- 使用@classmethod修饰的目的是调用方法时隐式传递类。
- 类方法不能访问实例变量,实例方法可以访问类变量。
- 作用:操作类变量
静态方法:
- 语法
- 定义:
@staticmethod
def 方法名称(参数):
方法体
- 调用:类名.方法名称(参数)
- 说明
- 使用@staticmethod修饰的目的是该方法不需要隐式传递参数,是直接讲单独的方法放入类中,不需要加‘self’,与类没有直接联系。
- 静态方法不能访问实例成员和类成员
- 作用:统一管理函数(定义在.py文件中的函数)
表达不需要使用实例成员和类成员时,使用静态方法。
私有成员:
- 做法:命名使用双下划线开头
- 作用:保护数据,外界不能随意赋值
- 本质:障眼法,也可以访问:
_类名__成员名
属性:
- 定义:
@property # 读取数据时执行(拦截直接读取的操作)
def 属性名(self):
return self.__ 属性名 # 私有的实例变量
@属性名.setter # 写入数据时执行(拦截直接写入的操作)
def 属性名(self,参数):
self.__ 属性名 = 参数
还可以使用__slots__限制一个类创建的对象只能有固定的实例变量,不能再额外添加。语法:在类中定义 __slots__ = (“变量名1”,”变量名2”,…)
- 调用:
对象地址.属性名 = 数据
变量 = 对象地址.属性名
继承:
- 代码:
class 子类名称(父类名称):
def __init__(self,父类参数,自身参数):
super().__init__(父类参数)
self.自身实例变量 =自身参数
若子类没有构造函数,则会自动调用父类的构造函数
isisntance(对象,类)函数:返回对象是否兼容类型。(查看是否是父类或自身所属的类)issubclass(类,类)是否兼容,兼容则返回Ture,