面向对象三大特征(封装/继承/多态)
一.封装
1.在介绍封装前我们先来了解下类的组成,下图可以看出,类中有特有的类属性,实例方法
类方法(@classmethod),静态方法(@staticmethod)。外部调用时有两种方式可用
(1)实例化一个对象,用对象.的方式去调用
(2)直接用类名.的方式去调用,涉及到self时,需传个实例化对象进去
2.接下来我们再来介绍下封装,封装就是把不想让外界知道属性或者方法封装到类中,外部
调用的时候不用去管调用方法的类别结构,这样提高了代码的安全性。从以上两种图中我们
可以看出方法/属性都可在外部调用,那么如果我们不想方法或者属性在外部调用,只要在内
部调用呢,那么接着往下看。
3. 我们把sex类属性和nameAge实例方法前加两个_,然后再外部调用时可以看到程序是报错的
,提示父类中并没有__sex。那么我们再在类中去定义一个name的方法,再方法内去调用nam
eAge方法,可以看到能够正常运行,那么说明__为开头的方法和属性只能再类类别调用,那么
如果我们非要再外部调用呢,有没有其它办法呢,我们接着往下看。
4.python中有个方法叫做dir(),用法dir(类名),可以查询出当前类中有多少可以使用的属性和方法,
下图我们可以看见除了cla原本的属性和方法,还有其它的一些,这是因为再我们定义一个类是它
就默认继承object类,所以查询出来的可用方法和属性是object+类本身的,回归正文,可看到
‘_cla__nameAge’和’_cla__sex’两个属性,我们先尝试调用看看就可以看出能不能调用成功。
二.继承(提高代码的复用性)
1.举个事例
小明的爷爷长鼻尖大眼睛。小明的爸爸也是长鼻尖大眼睛,同时又是大耳朵。小明的妈妈圆脸
长睫毛,而小明呢则长得更帅(长鼻尖大眼睛大耳朵,圆脸长睫毛)
2.继承有三种关系
单继承:小明的爸爸和小明的爷爷就属于单继承关系
多继承:小明同时继承了爸爸妈妈的大耳朵,圆脸长睫毛,属于多继承
多重继承:小明的长鼻尖大眼睛和爸爸爷爷就是要多重继承关系
3.下面我们看下实例
在子类中调用父类方法可使用super()去调用,也可使用父类名.的方式去调用父类中的方法,
这点我们下章在讲两者的区别
我们先实例化extend_father去运行看下结果,下图结果中可以看下子类extenf_father可继承父
类extend_grandFather中的方法
我们再来实例化xm类,看下运行结果,xm分别继承了extend_father、extend_grandFather、
mom类中的方法。
4.针对特殊(以__开头的)的方法和属于是不可以继承的,单也可通过上述讲的dir()方法查询可使用
的属性,也可直接调用,如下图
5.上述介绍的都是单个.py文件中的类继承,那么多个.py文件直接的继承如何操作呢,接着往下看
(1)两种模块的导入
1.import 模块路径(后也可加个as 起个别名)
2.from 模块路径 import 模块下的方法名
我们先来看下第一种
再来看看第二种,可以看出,两种效果相同,这里需要注意一点,因为我们两个.py文件在同一目
录下,所以导入的时候直接是模块的名称,如果不在目录下,需加下路径
6.方法重新
子类继承父类,可以调用父类的方法,那么如果父类的方法不满足子类的需要,子类就可以重写父
类的这个方法
三.多态
1.说多个也是一同雾水,简单理解不同对象调用同一个方法可以实现不同的效果
2.多态的两个重要步骤
(1)继承
(2)方法重新
3.简单举例
父亲有大耳朵,和三个孩子,但是三个孩子都不行要爸爸的大耳朵,感觉太丑,于是就在娘胎里
把爸爸的大耳朵方法给重新掉了(仅限于代码逻辑)
然后再实例化各个子类,虽调用的是同一个方法,但结果却不同