面向对象概述与python相关语法

面向对概述与Python相关语法

 

面向对象概念:

面向对象是指从对象的角度出发来考虑问题,拿到需求后,对需求进行划分,以面向对象的角度思考是谁(对象),做了什么(方法)。

其中对象是类的实例,类是对象的“模板”。属于同一个类的不同对象,它们的区别是数据(实参)不同。类与类之间的区别是行为(方法/函数)不同。

 

面向对象的特征:

封装,继承,多态

封装:封装的目的是封装变化,将每一个可能发生变化的点(如函数,参数等)单独放到一个类中,需求变化过程中,单独对对应的类进行操作。

从数据角度讲,每个对象会包含多个数据属性,(如某个学生包含学号,姓名等数据属性),封装是将多个基本数据属性合并提取出一个自定类型(如学生类,学生类包含学号,姓名,成绩等属性)。

从行为角度讲,封装是对外提供简单必要的功能,内部隐藏实现的细节。就是说将大多数函数的执行逻辑隐藏起来,直给外部客户端代码提供必要的调用入口。

从设计角度讲:分而治之,让多个类协同完成一项任务,类的内部处理变化点,每个类处理一个变化点(高内聚),类和类的关系尽量做到互不影响(低耦合)。

继承:直观上看是重用现有类的共性,在这些共性的基础上做个性扩展(子类是在父类的基础上做个性扩展)。在开发过程中是一个自下而上的过程。先有子类,从子类中提取共同点,产生父类。继承的作用是隔离变化点。不需要改变的部分做父类,保持不变的部分,需要改变的部分做子类。使客户端代码(调用方法的代码)与实现方式(方法的具体过程)隔离开。

多态:调用父类,执行子类。比如交通工具做父类,汽车,火车,飞机等做子类,客户端在使用时直接调用交通工具类,但交通工具具体的实现方式由子类执行。

 

面向对象的关系:

泛化,关联,依赖

泛化关系:泛化关系在本质上就是继承关系,父类是子类的泛化,泛化关系耦合度比较高。如父类和子类的关系,子类必须根据父类的改变而改变。

关联关系:体现的是部分与整体的关系,如一个类在执行过程中,以参数的形式调用了另外一个类。(分公司与总公司之间的关系)

依赖关系:协作关系,A类依赖B类,意味着A类的某个功能依靠B类实现,如在A类中调用了B类的方法。(施工方和材料商之间的关系)

 

面向对象的原则:

       开闭原则:增加新功能,不改客户端代码(如,父类起到中间隔离的作用,客户端使用工程中不改变父类代码,只需要在添加或修改相应的子类)

单一原则:一个类有且只有一个改变的原因。

       依赖倒置:使用抽象(父类),而不用具体(子类)

       组合复用:组合是指关联,使用关联关系,代替继承关系。

里氏替换:父类出现的地方,可以被子类替换,替换后保持原有功能。

迪米特法则:低耦合

 

面向对象相关语法:

定义类:

  1. 代码:

class Class_name:

“””文档说明”””

def  __init__(self,参数列表):

        self.实例变量 = 参数

def function(self,参数列表)

        函数体

 

  1. 说明:

-- 类名所有单词首字母大写

-- __init__叫做构造函数,创建对象时被调用,也可以省略。

-- self变量绑定的是被创建的对象,名字通常叫做”self”。

创建对象:

语法:

变量 = 构造函数(参数列表)

实例变量:

语法:

-- 定义:对象地址.变量名称

-- 调用:对象地址.变量名称

实例方法:

语法:

  1. 定义: def 方法名称(self,参数):

             方法体

  1. 调用:对象地址.实例方法名称(参数)

类变量:

  1. 语法
  1. 定义:在类中,方法外定义变量

class 类名:

     类变量名 = 数据

  1. 调用:

类名.类变量名

不建议使用对象.类变量名.

  1. 说明
  1. 存储在类中。
  2. 只有一份,被所有对象共享,任何对象都可以对类变量进行操作,下一个对象调用的是上一个对象操作后的值。
  1. 描述所有对象的共有数据。

类方法:

  1. 语法
  1. 定义:

@classmethod

def 方法名称(cls,参数):

      方法体

  1. 调用:类名.方法名(参数)

      不建议使用对象.类方法名.

  1. 说明
  1. 至少有一个形参,用于绑定调用该方法的类,一般命名为” cls”。
  2. 使用@classmethod修饰的目的是调用方法时隐式传递类。
  3. 类方法不能访问实例变量实例方法可以访问类变量
  1. 作用:操作类变量

静态方法:

  1. 语法
  1. 定义:

@staticmethod

def 方法名称(参数):

         方法体

  1. 调用:类名.方法名称(参数)
  1. 说明
  1. 使用@staticmethod修饰的目的是该方法不需要隐式传递参数,是直接讲单独的方法放入类中,不需要加‘self’,与类没有直接联系
  2. 静态方法不能访问实例成员和类成员
  1. 作用:统一管理函数(定义在.py文件中的函数)

表达不需要使用实例成员和类成员时,使用静态方法。

私有成员:

  1. 做法:命名使用双下划线开头
  2. 作用:保护数据,外界不能随意赋值
  3. 本质:障眼法,也可以访问:

_类名__成员名

属性:

  1. 定义:

@property              # 读取数据时执行(拦截直接读取的操作)

def 属性名(self):

        return  self.__ 属性名    # 私有的实例变量

 

@属性名.setter          # 写入数据时执行(拦截直接写入的操作)

def 属性名(self,参数):

        self.__ 属性名 = 参数

还可以使用__slots__限制一个类创建的对象只能有固定的实例变量,不能再额外添加。语法:在类中定义 __slots__ = (“变量名1”,”变量名2”,…)

  1. 调用:

对象地址.属性名 = 数据 

变量 = 对象地址.属性名

继承:

  1. 代码:

class 子类名称(父类名称):

        def __init__(self,父类参数,自身参数):

               super().__init__(父类参数)

               self.自身实例变量 =自身参数

若子类没有构造函数,则会自动调用父类的构造函数

isisntance(对象,类)函数:返回对象是否兼容类型。(查看是否是父类或自身所属的类)issubclass(类,类)是否兼容,兼容则返回Ture,

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VictorHan01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值