在Python进阶记录之基础篇(十六)中,我们介绍了Python面向对象中对属性的访问限制,需要重点掌握私有变量和公有变量的区别和用法,牢记面向对象的编程规则。今天我们讲一下Python面向对象中的另一个重要特点——继承。
继承是面向对象的三个基本特征之一,当我们在定义一个类的时候,可以继承某个已存在的类,新定义的类称为子类,而被继承的类称为父类,也叫做基类或超类。
例如之前内容中我们定义类Student的时候,其实是继承了Python中的基类object,我们称Student继承自object,Student是object的子类,object是Student的父类。
继承可以使子类具有父类的各种属性和方法,而不需要再次编写相同的代码。
继承的基本概念
上述代码中,我们首先定义了一个Person类,然后再定义一个Men类,并让它继承自Person类,Python中继承的写法就是在类名后的括号中写入要继承的类名。可以看到,虽然在类Men中,我们没有写任何代码,但是由于它继承自Person类,在创建Men对象的时候,我们可以传入父类Person中的name和age属性,并能使用父类的成员方法eat( )。
子类除了继承父类的所有属性和方法外,也能够定义自己特有的属性和方法。
子类定义特有的属性和方法
我们给Men方法定义父类没有的属性post以及成员方法info( ),在初始化方法__init__( )中,为了继承父类的属性,我们需要调用父类的__init__( )方法,调用方式有以下两种:
1、父类名.__init__(self, 各属性名) 2、super(子类名, self).__init__(各属性名)
当然,由于我们这里的Person类的属性都定义成了私有变量,对于子类Men来说,其实并没有继承__name和__age,因为Person类的私有变量是不允许Person类外部调用的,子类只能继承父类的公有变量。但我们仍然需要调用父类的__init__( )进行继承,这样才能更好地使用从父类继承过来的成员方法。
子类在继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。
方法重写
以上代码中,我们将父类Person中的name改成公有变量,然后在子类Men中也定义一个成员方法eat( )。可以看到,此时再调用eat( )方法,将调用子类Men中的eat( )方法。这种子类覆盖父类方法的写法我们就叫做方法的重写。
如果你熟悉面向对象,那么你肯定知道除了重写,还有一个重载的概念。重载是指在一个类里面,方法名字相同,而参数不同,参数不同可以是参数类型不同,也可以是参数个数不同。
方法重载的概念
我们在类Person中定义了两个eat( )方法,一个接收一个参数,另一个接收两个参数,这就是方法的重载。然而,当我们试图调用一个参数的eat( )方法时,Python报错了,它只承认接收两个参数的eat( )方法。这是为什么呢?
事实上,Python根本不需要方法的重载。我们知道,重载主要是参数类型不同或参数个数不同。对于参数类型不同,因为Python可以接受任何类型的参数,不同的参数类型在Python中是相同的代码,所以没有必要做成两个不同函数。而对于参数个数不同,因为Python有缺省参数的功能,我们对于参数个数不确定的参数设定为缺省参数即可解决问题。
Python中的重载
我们将之前的两个eat( )方法合并,只需将参数变为可变参数即可实现相关需求。由此可见,对于重载中参数不同的两个要求都有对应的解决方案,Python自然就不需要方法重载了。
以上内容介绍了Python面向对象中继承的相关知识以及重写和重载的区别和实现,需要重点掌握继承的基本概念和用法,理解重写和重载的区别。感谢大家的支持与关注,欢迎一起学习交流~