Python面向对象的三大特征

Python面向对象的三大特征

类的特点

从形式上看,对象封装了属性就是变量,而方法和函数是独立性很强的模块,封装就是一种信息掩蔽技术,使数据更加安全。
例如,列表(list)是Python的一个序列对象,我们要对列表进行调整,如下所示代码:

list1 = ['K','J','L','Q','M']
list1.sort()
list1
['J', 'K', 'L', 'M', 'Q']

在上例中,我们调用了排序函数sort()对无序的列表进行了正序排序。

封装

由此可见,Python的列表就是对象,它提供了若干种方法来供我们根据需求调整整个列表,但是我们不知道列表对象里面的方法是如何实现的,也不知道列表对象里面有哪些变量,这就是封装。它封装起来,只给我们需要的方法的名字,然后我们调用这个名字,知道它可以实现就可以了,然而它没有具体告诉我们是怎么实现的。

多态

不同对象对同一方法响应不同的行动就是多态。
如下所示代码:

 class Test_X:
	     def func(self):
		        print("测试X...")		
class Test_Y:
	     def func(self):
		        print("测试Y...")	

运行结果如下:

x = Test_X()
y = Test_Y()
x.func()
测试X...
y.func()

测试Y…
在上例中,我们分别定义了2个类: Test_X, Test_Y,每个类里面都定义了同名函数func,函数func分别实现的功能是:输出字符串“测试X…”

测试Y…”,类Test_X()的实例对象为:x,类Test_Y()的实例对象为:y,对象x和对象y分别调用了同名函数func(),分别运行得到了不同的结果:测试X…和测试Y…。由此可见,不同对象调用了同名方法(函数),实现的结果不一样,这就是多态。
注意:self相当于C++的this指针。由同一个类可以生成无数个对象,这些对象都来源于同一个类的属性和方法,当一个对象的方法被调用的时候,对象会将自身作为第一个参数传给self参数,接收到self参数的时候,Python就知道是哪一个对象在调用方法了。

继承

继承是子类自动共享父类的数据和方法的机制。
语法格式如下:

Class ClassName(BaseClassName):
             ……
ClassName:是子类的名称,第一个字母必须大写。
BaseClassName:是父类的名称。

被继承的类我们称为基类、父类或超类,而继承者我们称为子类。子类可以继承父类的任何属性和方法。
我们以列表对象为例,如下所示程序代码:

class Test_list(list):
     pass
运行结果如下:
list1 = Test_list()
list1.append('O')
list1
['O']
list1.append('MT')
list1
['O', 'MT']
>>> list1.sort()
list1
['MT', 'O']

在上例中,我们定义了一个类Test_list(),它继承list,然后将它赋值给变量list1,list1分别调用了append()、sort()方法,得到了我们所期望的结果。从中可以看出,我们定义了类Test_list(),它继承了属于list的属性和方法,所以,我们就可以在对象Test_list里面使用了,这就是继承。

在使用类继承机制的时候,有几点需要注意:
(1)如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性。
(2)子类重写了父类的方法就会把父类的同名方法覆盖,如果被重写的子类同名的方法里面没有引入父类同名的方法,实例化对象要调用父类的同名方法的时候,程序就会报错。
要解决上述问题,就要在子类里面重写父类同名方法的时候,先引入父类的同名方法。要实现这个继承的目的,有2种技术可采用:一是调用未绑定的父类方法,二是使用super函数。
我们先看看“调用未绑定的父类方法”的技术,它的语法格式如下:

paraname.func(self)
语法各项解释如下:
Paraname——父类的名称;
.——点操作符;
func——子类要重写的父类的同名方法名称;
self——子类的实例对象,注意这里不是父类的实例对象。

接下来,我们看看“使用super函数”的技术,super函数可以自动找到基类的方法和传入self参数,它的语法格式如下:
super().func([parameter])

语法各项解释如下:

super()——super函数;
.——点操作符
func——子类要重写的父类的同名方法名称;
parameter——可选参数,如果参数是self可以省略。

使用super函数的方便之处在于不用写任何基类的名称,直接写重写的方法就可以了,这样Python会自动到基类去寻找,尤其是在多重继承中,或者子类有多个祖先类的时候,super函数会自动到多种层级关系里面去寻找同名的方法。使用super函数带来一个好处,如果以后我们要更改基类,直接修改括号“()”里面的基类名称就可以了,不用再修改重写的同名方法里面的内容。

多重继承

可以同时继承多个父类的属性和方法,称为多重继承。语法格式如下:

Class ClassName(Base1, Base2, Base3):
		……
	 ClassName ——子类的名字;
Base1, Base2, Base3——基类1的名字,基类2的名字,基类3的名字;有多少个基类,名字依次写入即可。

虽然多重继承的机制可以让子类继承多个基类的属性和方法使用起来很方便,但很容易导致代码混乱,有时候会引起不可预见的Bug,对程序而言不可预见的Bug几乎就是致命的。因此,当我们不确定必须要使用“多重继承”语法的时候,尽量避免使用它。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Deng872347348

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

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

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

打赏作者

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

抵扣说明:

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

余额充值