Python继承性和 java 是一样的吗?

来源:千锋教育
发布时间:2023-11-06 11:27:17
分享

聊完了多态,再来看看面向对象的另一个特征:继承性。

什么是继承?继承就是定义好了一个类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相关知识,请关注IT培训机构:千锋教育。https://www.mobiletrain.org/

声明:本站部分稿件版权来源于网络,如有侵犯版权,请及时联系我们。

相关推荐

  • python模块搜索路径 在a.py中导入模块b的时候,python会做一系列的模块文件路径搜索操作:b.py在哪里?只有找到它才能读取、运行(装载)该模块。在任何一个python程序启动时,都会将模块的搜索路径收集到sys模
  • Python可执行文件和模块 python源代码文件按照功能可以分为两种类型:用于执行的可执行程序文件不用与执行,仅用于被其它python源码文件导入的模块文件例如文件a.py和b.py在同一目录下,它们的内容分别是:#b.pyx
  • Python元类之通过元类实现数据库ORM框架 ORM框架是什么如果是没有做过后端的小伙伴上来估计会有点蒙,这个ORM框架究竟是什么?ORM框架是后端工程师常用的一个框架,它的英文全称是ObjectRelationalMapping,即对象-关系映
  • Pytorch入门之配置云服务器环境 Pytorch简介Pytorch底层是Torch框架,Torch框架是一个科学计算框架,拥有一个与Numpy类似的张量操作库。非常灵活,但是它的语言是Lua,比较小众,因此没有广泛流行。后来开发团队在
  • Python之metaclass的原理和用法 metaclassmetaclass的英文直译过来就是元类,这既是一个概念也可以认为是Python当中的一个关键字,不管怎么理解,对它的内核含义并没有什么影响。我们可以不必纠结,就认为它是类的类的意思
  • Python之__init__和__new__的区别是什么 真假构造函数如果你去面试Python工程师的岗位,面试官问你,请问Python当中的类的构造函数是什么?你不假思索,当然是__init__啦!如果你这么回答,很有可能你就和offer无缘了。因为在Py