首页 / 知识
Python继承性和 java 是一样的吗?
2023-11-12 13:36:00
聊完了多态,再来看看面向对象的另一个特征:继承性。
什么是继承?继承就是定义好了一个类A(父类);再定义一个新类B(子类),类B拥有类A的方法和属性,并且又定义了新的属性和方法。类A称为父类,类B称为子类。
java中定义两个类的继承关系,使用extends关键字实现,在python中呢?
classFather:
"""这是一个父类"""
__age=45
classSon(Father):
"""这是一个子类"""
python中不需要加关键字来说明继承关系,只需要将父类的名称放在括号中就可以了,看起来要比java简洁一些。
父类和子类的初始化函数调用
前面讲过,pythonclass中可以定义自己的初始化函数,在实例化的时会被调用。那如果父类和子类都有初始化函数或者父类有而子类没有,那初始化函数该如何执行呢?这里分为三种情况来说明,先来看第一种。
第一种情况,
父类有init而子类没有,这时父类的初始化函数会被默认调用
classFather():
"""这是一个父类"""
def__init__(self,age):
print("Father'sinitfunctioninvoke")
self.__age=age
classSon(Father):
"""这是一个子类"""
son=Son(5)
这里要注意,父类中需要的age参数一定要传进去哦,要不然会报错的。
第二种情况
父类,子类都有init,而子类没有显式调用父类的init方法时,父类初始化函数是不会被调用的
classFather():
"""这是一个父类"""
def__init__(self,age):
print("Father'sinitfunctioninvoke")
self.__age=age
defget_age(self):
returnself.__age
classSon(Father):
"""这是一个子类"""
def__init__(self,age):
print("Son'sinitfunctioninvoke")
self.__age=age
son=Son(5)#Son'sinitfunctioninvoke
print(son.get_age())#AttributeError:'Son'objecthasnoattribute'_Father__age'
细心的同学会发现,代码中的最后一句报错了,表示Son对象没有Father类的__age变量。这是因为
父类的初始化函数没有执行,父类的__age变量则没有初始化
get_age函数是被子类从父类继承来的,返回的是父类的__age变量
那我要是想解决这个错误,该怎么做呢?有两种方法
在子类Son的初始化函数中显式调用父类Father的初始化函数
在子类Son中重新定义个get_age方法,这样就会覆盖父类的同名方法,返回的是子类的_age变量
第二种方法就不贴代码了,感兴趣的话可以试试。重点来看第一种方法,这就引出了第3种情况。
第三种情况
子类在自己定义的init方法中,显式调用父类的init方法,父类和子类的属性都会被初始化
classFather():
"""这是一个父类"""
def__init__(self,age):
print("Father'sinitfunctioninvoke")
self.__age=age
defget_age(self):
returnself.__age
classSon(Father):
"""这是一个子类"""
def__init__(self,age):
print("Son'sinitfunctioninvoke")
self.__age=age
super(Son,self).__init__(age+25)
defget_age(self):
returnself.__age
defget_father_age(self):
returnsuper(Son,self).get_age()
son=Son(5)
#Son'sinitfunctioninvoke
#Father'sinitfunctioninvoke
print(son.get_father_age())#30
print(son.get_age())#5
看到代码中是怎么调用父类的初始化函数吗?对,用的是super。
java中也有super关键字,表示对父类的指代,python的super是怎么用的,原理是什么?我们来看下。
super有哪些用法?
下面说明的只针对python单继承的情况,多继承这里暂不涉及,有兴趣的同学可以自行充电。
在单继承中,super也可以看做对其父类的指代,它的使用场合就是用来调用父类的方法:
调用父类的__init__方法
实现了和父类相同的功能,还需要调用父类的方法
它的写法是super(Son,self).xxx,当然也可以写成super()这种简写的形式。
来看代码
classFather():
"""这是一个父类"""
def__init__(self,age):
print("Father'sinitfunctioninvoke")
self.__age=age
defget_age(self):
returnself.__age
classSon(Father):
"""这是一个子类"""
def__init__(self,age):
print("Son'sinitfunctioninvoke")
self.__age=age
super(Son,self).__init__(age+25)
defget_age(self):
returnself.__age
defget_father_age(self):
returnsuper(Son,self).get_age()
son=Son(5)
#Son'sinitfunctioninvoke
#Father'sinitfunctioninvoke
print(son.get_father_age())#30
print(son.get_age())#5
通过代码来窥探下它的执行原理,以super(Son,self).get_age()为例
self是Son的一个实例,super把self转化为父类Father的一个实例对象
因为self经过了转化,那它得到的__age,也是父类初始化时得到的__age
以上内容为大家介绍了Python继承性和java是一样的吗?,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注我们http://www.mobiletrain.org/
最新内容
相关内容
python的调用绑定方法和非绑定方法
python的调用绑定方法和非绑定方法,代码,方法,实例,第一,培训,时计,奇数,偶数,参数,定义,在Python中,如果用实例去调用方法,这种限制就被称为PyPython网络编程调用接收数据的三种
Python网络编程调用接收数据的三种方法,数据,代码,基础,通用,通讯,服务,网络,培训,方法,报文,最近在使用python进行网络编程开发一个通用的tc为何你的Python代码应是扁平与稀疏
为何你的Python代码应是扁平与稀疏的,代码,培训,信息,观察,设计,工具,嵌套,闻闻,程序员,沉思,Python之禅之所以得名,正是由于它那简明扼要的规Python 之模块重载的五种方法
Python 之模块重载的五种方法,环境,培训,方法,模块,文件夹,例子,下面,内容,语句,请看,python环境准备新建一个foo文件夹,其下包含一个bar.py文使用Python的toolz库开始函数式编
使用Python的toolz库开始函数式编程,代码,函数,培训,位置,参数,字典,顺序,操作,结果,测试,toolz库允许你操作函数,使其更容易理解,更容易测试代python之什么是函数式编程?
python之什么是函数式编程?,系统,概念,项目,大规模,状态,数据,培训,函数,语言,副作用,函数式编程(简称FP)是一种编程范式,其中最基本的元素是Python变量数据类型的转换
Python变量数据类型的转换,代码,数据,培训,信息,字符串,类型,变量,整数,浮点,函数,虽然Python是弱类型编程语言,不需要像Java或C语言那样还要Python变量的类型(弱类型语言)
Python变量的类型(弱类型语言),检测,代码,数据,培训,类型,变量,语言,赋值,数字型,字符串,在强类型的编程语言中,定义变量时要指明变量的类型,而Python文件读取相关方法
Python文件读取相关方法,数据,位置,文件,中行,培训,方法,字节,内容,结果,字符串,我们知道,对文件的读取操作需要将文件中的数据加载到内存中,而怎么在Python装饰器中自定义功能呢
怎么在Python装饰器中自定义功能呢?,代码,包装,环境,名称,工具,名字,变动,业务,主体,面临,setattr和getattr操作首先我们来看下setattr和geta列举Python面向对象中带双下划线的
列举Python面向对象中带双下划线的特殊方法,信息,代码,培训,对象,属性,方法,实例,字符串,里边,内容,__new__:生成实例__init__:生成实例的属性_python内置函数:map、reduce、filte
python内置函数:map、reduce、filter的用法和区别,数据,培训,数字,函数,序列,内容,元素,参数,列表,个数,map:根据函数对指定序列做映射map参数