目前代码技能已经成了测试同学面试考核的刚需,对于测试开发来讲需求最大的是java和python两门语言,二者也都是面向对象语言。对于刚入门代码的同学来说面向对象相关的概念比较难于理解,而面向对象编程相关的知识点偏偏又是面试中的高频问题,所以本文我以python为例,带大家快速搞定面向对象中的核心概念并通过代码实现的方式来帮助大家对其加深理解!
面向对象基础
对象
对象有两个层次的概念,现实生活中对象指的是客观世界的实体;而程序中对象就是一组变量和相关方法的集合,其中变量表明对象的状态,方法表明对象所具有的行为。可以将现实生活中的对象经过抽象,映射为程序中的对象,对象是对现实的高度抽象。
类
对象在程序中是通过一种抽象数据类型来描述的,这种抽象数据类型即Class。类是描述对象的“基本原型”,它定义一类对象所能拥有的数据和能完成的操作。在面向对象的程序设计中,类是程序的基本单元。
类和对象的关系
对象是类的一个实例,创建一个对象就是类进行了实例化,从代码角度讲就是在内存中开辟了一块新的地址空间运行程序。一个类可以创建无数个实例(只要计算机的内存足够大),使用python代码实现如下:
dog =Animal()
即对象dog是类Animal的一个实例。
属性
存储对象的状态,可以理解为变量。
方法
实现对象的行为,可以理解为函数。
上面是面向对象理论的解释,我们以去动物园看动物为例,我们通常说去看动物,但是没有人能够看到动物这个抽象的东东,我们只能看到具体的某一种类的动物。这里的动物就是类的概念,而我们看的具体动物,例如:东北虎就是实例。关于动物的种类、颜色以及雌雄就是动物的属性,而动物具备的基础能力,例如:跑、吃、叫等等,我们则可以将其定义为方法。
面向对象三原则
面向对象三原则包括:封装、继承、多态。
封装
封装实际上是使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。我们在使用api时,如果提供方不给我们源码,我们是无法知道其内部实现的,但是这并不会妨碍我们对api的使用。简单规则如下:
xx: 公有变量或方法;
_xx:变量或方法前面加双前置下划线,无法在外部直接访问;
class Demo(object):
public_var="共有变量"
__private_var = "私有变量"
def public_func(self):
print("共有方法")
def __private_func(self):
print("私有方法")
d=Demo()
d.public_func()
d.__private_func()
当执行代码时会报错:
AttributeError: 'Demo' object has no attribute '__private_func'
错误信息提示,Demo中找不到方法__private_func,原因是该方法是私有方法,不能被Demo类以外的模块或者类调用!所以大家在设计类中的方法或者属性时需要考虑好是否需要被外部调用,如果需要则设计成xx形式,如果不需要则设计成__xx形式。对于刚入门编码的小白来说,把属性和方法都设计成共有即可。
继承
继承性是面向对象程序设计语言的另一基本特征,通过继承可以实现代码的复用。继承而得到的类为子类,被继承的类为父类,所有直接或间接被继承的类都是父类。继承是子类利用父类中定义的方法和变量,就像它们属于子类自己一样。Python中支持多重继承。如下代码表示Dog类继承Animal类并通过Dog(Animal)实现,在python中object类是所有类的父类,所以Animal继承object类。
class Animal(object):
def run(self):
print('Animal isrunning...')
class Dog(Animal):
pass
子类使用父类的run方法就像使用他自己的方法一样!
dog=Dog()
dog.run()
特征:
(1)继承关系是传递的。如果类C继承类B,类B继承类A(多继承),则类C既有从类B那里继承下来的属性与方法,也有从类A那里继承下来的属性与方法,还可以有自己新定义的属性和方法。继承来的属性和方法尽管是隐式的,但仍是类C的属性和方法。继承是在一些比较一般的类的基础上构造、建立和扩充新类的最有效的手段。
(2)继承简化了人们对事物的认识和描述,能清晰体现相关类之间的层次结构关系。
(3)继承提供了软件复用功能。如果类B继承类A,则建立类B时只需要再描述与基类(类A)不同的少量特征(数据成员和成员方法)即可。这种做法能减小代码和数据的冗余度,大大增加程序的重用性。
(4)继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。
(5)提供多重继承机制。从理论上说,一个类可以是多个一般类的特殊类,它可以从多个一般类中继承属性与方法,这便是多重继承。
多态
多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。类具有继承关系,并且子类类型可以向上转型看做父类类型。举一个例子大家就懂了
#定义类Animal
class Animal(object):
def run(self):
print('Animal is running...'
#定义类Chicken,重写Animal的run方法
class Chicken(Animal):
def run(self):
print('Chicken is running with 2 legs')
#定义类Fish,重写Animal的run方法
class Fish(Animal):
def run(self):
print('fish is swimming')
chicken=Chicken()
chicken.run()
fish=Fish()
fish.run()
animal=Animal()
animal.run()
#定义一个函数调用run方法
def which_animal_running(p_obj):
p_obj.run()
这种行为称为多态。也就是说,方法调用将作用在p_obj的实际类型上。它实际上拥有自己的 run()方法以及从Animal类继承的 run()方法,但调用 p_obj.run()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。
which_animal_running(chicken) #执行Chicken类的run方法
which_animal_running(fish) #执行Fish类的run方法
which_animal_running(animal) #执行Animal类的run方法