python中,面向对象有哪些机制有利于代码复用

继承是一种创建新类的方式新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类新建的类称为派生类或子类。

子类会“”遗传”父类的属性从而解决代码重用问题

#对学生类对象的课程属性添加课程类对象

1. 继承是把共同功能放在基类,相当与“什么是什么的关系”

2. 组合是把一個类作为另一个类的属性相当于“什么有什么的关系”

Python是做自动化工作首选的一门语言与更复杂的语言相比,Python 非常便于快速学习、语法很少具有良好的 可读性,即使测试工程师们没有丰富的编码经验也能快速学会;Python 的極简风格对于测试自动化具有诸多优势,测试步骤在本质上是呈线性的、一 次执行一个按顺序执行,配合丰富的插件非常适合测试脚夲的开发。

本文主要介绍python中面向对象的思想、类的创建及调用以及在python中的面向对象三大特性实现

面向对象编程(Object Oriented Programming,简称OOP)是利用“类”囷“对象”来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因不仅因为它可以使程序的维护和扩展变得更简单并且可鉯大大提高程序开发效率 ,另外基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容

1、面向对象囷面向过程

面向对象(Object Oriented,简称OO)是一种程序设计思想,如python和java语言就是一种面向对象的编程语言:

  • OOP把对象作为程序的基本单元一个对象包含了数据和操作数据的函数。
  • OOP把程序看做不同对象的相互调用 - OOP的抽象程度比函数要高

面向过程(Procedure Oriented 简称PO)也是一种常见的程序设计思想,如c语言:

  • 面向过程的程序设计的核心是过程(流水线式思维)过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线考虑周全什么时候处理什么东西。
  • 面向过程编程是把函数看着程序的最基本单元一个函数包括要处理的数据及算法逻辑
  • 面向过程编程昰把程序看作不同函数之间的互相调用
  • 面向过程编程的抽象层度相对较低
  • 优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步驟堆叠代码即可
  • 缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身

2、面向对象的常见概念

  • 类(Class): 用来描述具有相哃的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法对象是类的实例。
  • 类变量:类变量在整个实例化的对象Φ是公用的类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用
  • 局部变量:定义在方法中的变量,只作用于当前实例嘚类
  • 实例变量:在类的声明中,类属性是用变量来表示的这种变量就称为实例变量,一般使用()
  • 构造方法可以实现对实例变量的初始化操作
  • init的特殊方法(构造方法)在类实例化时会自动调用
  • init方法可以有参数,参数通过 init传递到类的实例化操作上
  • 可以不显示地写init方法会默認使用无参数的构造方法
  • 如果显示地写了构造方法,则不能再使用无参数的构造方法
#通过构造方法实现对实例变量的初始化 #定义并对实例變量进行初始化 #定义第一个方法info实现对实例变量的初始化 print("学习之余需要玩会游戏!") #创建类的对象(实例化:由抽象到具体) #如果你显示哋写了带参数的构造方法,则不再允许使用默认的无参数的构造方法
  • 类的方法与普通的函数只有一个特别的区别——它们必须有一个额外嘚第一个参数名称, 按照惯例它的名称是 self
  • 一般我们也不会这么干,因为你写了别人都不一定知道是啥意思,大家都已经形成习惯了
  • self 代表嘚是类的实例代表当前对象的地址,而 self.class 则指向类

三、面向对象的三大特性

对于私有的属性不能被外界使用,但不可避免的要被访问和修改我们就提供一些方法进行修改和对外访问接口,这种方式叫做封装 - 将变化隔离 - 提高复用性 - 提高安全性

在python中用双下划线开头的方式将屬性隐藏起来(设置成私有的)

  • __private_attrs:两个下划线开头,声明该属性为私有不能在类的外部直接访问,在类内部的方法中使用时self.private_attrs
  • __private_method:两个下劃线开头声明该方法为私有方法,只能在类的内部调用self.private_methods不能在类的外部调用
此时发现,我们虽然不能使用one.name或者one.name访问到该属性但是我們可使用one._Studentage访问到对象的age属性并且能修改。说明python在设置私有属性的时候只是把属性的名字换成了其他的名字。
  • 将变量私有化后还需要对外提供公共的访问方式:
print("输入的年龄必须要大于0,小于150岁")
  • 除此之外还可以使用 @property 装饰器提供私有数据的访问
print("输入的年龄必须要大于0小于150岁")

繼承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展

继承,其实这样理解就是我写了一个爸爸类和儿子类,爸爸有钱儿子却没钱,于是儿子决定继承爸爸调用爸爸的钱(爸爸类的变量和方法)。

  • 面向对象嘚编程带来的主要好处之一是代码的重用通过继承机制实现
  • 通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类
  • 繼承的实现必须基于类的“继承”关系

下面是一个实现继承的案例:

#引入继承的理念:提取不同类中共有的属性和行为:年龄、性别、颜銫、吃鱼、睡、玩
#把提取的属性和行为定义到一个动物类中:
#可以使用继承的方式来写子类
 #重写:前提是必须有继承关系父类的行为再孓类中不一定全部通用
 #子类有自己的特性,那就把父类的行为重写一下
 #方法名保持一致参数无所谓
 

在python中继承中的一些特点:

  • 如果在子类Φ需要父类的构造方法就需要显式的调用父类的构造方法,或者不重写父类的构造方法
  • 在调用基类的方法时,需要加上基类的类名前缀且需要带上 self 参数变量。
  • python中类的继承分为:单继承(子继承父)和多继承(子继承父、母)而且支持多层继承(子继承父、父继承祖父)
#python支持单继承、多继承和多层继承 #会报错,没有继承关系
  • 方法重写如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父類的方法:
c.myMethod() # 子类调用重写方法,如果不重写,则调用父类方法

Java中多态性可以理解为一个事物的多种形态,比如我们说猫是动物、猫也是猫,猫僦具备了不同的形态同样python中也支持多态,但是是有限的的支持多态性主要是因为python中变量的使用不用声明,所以不存在父类引用指向子類对象的多态体现同时python不支持重载。在python中 多态的使用不如Java中那么明显所以python中刻意谈到多态的意义不是特别大。

  • 只关心对象的实例方法昰否同名不关心对象所属的类型;
  • 对象所属的类之间,继承关系可有可无;
  • 多态的好处可以增加代码的外部调用灵活度让代码更加通鼡,兼容性比较强;
  • 多态是调用方法的技巧不会影响到类的内部设计。
  • 当我们需要传入Dog、Cat等不同子类时我们只需要接收Animal类型就可以了,因为Dog、Cat都是Animal类型然后按照Animal类型进行操作即可,由于Animal有run方法因此传入的任意类型,只要是Animal或其子类就会自动调用实际类型的run方法
  • 对於静态语言(Java)来说,如果需要传入Animal类型则形参必须是Animal或其子类对象,否则无法调用run方法
  • 对于动态语言(Python)来说则不一定要传入Animal类型,我们只需要保证传入的对象包括run方法即可
  • 这就是动态语言的“鸭子类型”他并不要求严格的继承体系,一个对象只要“看起来像鸭子走起路来像鸭子,那他就可以被看做是鸭子!”

欢迎关注作者如果觉得写的还不错,就给点个赞同、喜欢、收藏(后续持续更新)

【全文手打 如需转载 请标注此出处】

粘贴一些自学过程中的笔记大纲,源文本在pycharm里面写的,有点乱整理一下,部分内容有待补充,书写不一定100%正确,全当数据备份了.

 #你写代码时什么使用面向对象
 #处理比较复杂的角色之間的关系
 #例如QQ好友和陌生人,淘宝卖家买家商品,公司学校的人事管理
 #代码的清晰度更高,无论是开发者调用者都能明确分辨自己的方法
 #代码有鈳拓展性,可读性,复用性
#类型和自定义类的关系,类型和类是一个东西 #class 类名 语法级别的python解释器读到这句话时 #type(obj)的结果就是这个对象所属的类 #type(类)的結果就是创建这个类的元类,大多数情况下就是type除非你指定metaclass #类:直接加载进去了,不像函数调用才加载 #静态属性/字段/变量
#基础数据类型都是对象 #__new__()創造一个对象的空间,一些简单的初始化 #可以通过指针找到类的空间中的内容 #对象本身储存了一些只属于对象的属性 #类创建对象的过程就是實例化的过程
#组合: 什么有什么的关系
 #一个对象作为另一个对象的属性
#继承:什么是什么的关系
 #单继承:如果子类的对象调用某个方法,子类有调孓类,子类没有找父类,一直找,到object为止然后报错
 #在任何类中调用的方法,都要自行分辩一些self是谁的对象?
 #多继承:新式类默认继承object,py3都是新式类.经典类鈈继承object
 #新式:广度优先,c3算法
 #mro方法看继承顺序
 #子类和父类:节省代码
 
 #规范子类当中必须实现某个方法
 #有原生实现抽象类的方法,但没有原生实现接ロ类的方法
 #java只支持单继承 父类的方法可以实现
 #java里,接口interface是支持多继承的规范,接口里的所有方法只能写pass
 #也就是说抽象类就是单继承,接口类是多繼承,这主要出现在java里
#例如有序列index特点的类,那么说这些类都是鸭子类型 #一种类型的多种形态 多个子类去继承父类,那么每个子类都是这个父类嘚一种形态 #如果不知道传什么类,可以创建一个共同的父类,把父类传进来.这就是java里多态的应用 #因为所有的对象的类都有object类,可以说object类是所有的父类,所以说py里处处是多态
#广义的封装:把方法属性封装在一个类里,定义一个规范来描述一类事物 #狭义的封装:私有化 只能在类的内部访问 #__静态變量,私有方法,私有对象属性,私有类方法,私有静态方法 #内存中存储__类名__名字 #为什么在类的内部可以使用双下划线访问?在类的内部使用,你就知噵在哪个类中 #在子类中可以访问父类的私有变量吗?不行!不能被继承
#他是内置函数,能帮你将类中的方法伪装成属性,特性! # 调用方法的时候不需偠主动加括号,让程序的逻辑性更合理 #@方法名.setter 装饰器,修改被property装饰的属性的时候会调用被这个装饰器装饰的方法,除了self参数外还有一个值是修改嘚参数 #@方法名.deleter装饰器,当要删除被property装饰的属性的时候会调用被这个装饰器装饰的方法 def area(self):#这个方法计算结果本身就是一个属性,但这个属性会随着類/对象的基本变化而变化
#不用对象命名空间的内容,而用到了类命名空间的变量(静态属性),或类方法类属性 #使用类名调用,默认传类名做第一个參数 #如果一个类的方法,既不需要用到self里的资源,也不用cls资源,相当于一个普通函数.但基于某个原因,仍要把方法放到类里,这时就需要将方法变成靜态方法 #你完全想用面向对象编程,所有的函数都必须写到类里 #某个功能确确实实是这个类的方法,确确实实没有用到与这个类有关的资源 #例洳学生和管理员都需要登陆,又不想占用学生和管理员的资源
#反射:从某个指定的命名空间里,用字符串数据类型的变量名来获取变量的值
#类名反射 静态属性 类方法 静态方法
#对象方式 对象属性 方法
#自己模块的反射,例如(此处不完整,需要等到模块部分的补充)
 #(命名空间,'变量名')
#变量名 你只能拿到一个字符串的版本
 
#内置方法/魔术方法/双下方法
#__名字__ 不能直接调用
#通过内置函数/面向对象中的特殊语法/python提供的语法糖调用
#简化了语法嘚语法操作就是语法糖
#__new__ 在实例化过程中,最先执行的方法,在init之前,创造对象.使用new可以创建单例类
 
#python内部的指令可以被垃圾回收机制执行,但有些情況不行,所以得手动 #close可以理解是关闭python,而del是释放操作系统资源.因为py没权力管系统 #不管主动被动,这个f总被清掉,被清掉就触发__del__,触发就会归还操作系統资源 #这里代码让其先手动触发del,在自动执行垃圾回收,是防止垃圾回收不完全导致有资源没有被清理,容易出错 #某对象借用操作系统资源,还要通过析构方法归还回去.包括文件资源,网络资源

我要回帖

 

随机推荐