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

发布时间:2022-04-01 09:55:19 人气:37 作者:多测师

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

  什么是继承?继承就是定义好了一个类 A(父类);再定义一个新类 B(子类),类 B 拥有类 A 的方法和属性,并且又定义了新的属性和方法。类 A 称为父类,类 B 称为子类。

  java 中定义两个类的继承关系,使用 extends 关键字实现,在 python 中呢?

  class Father:

  """ 这是一个父类 """

  __age = 45

  class Son(Father):

  """ 这是一个子类 """

  python 中不需要加关键字来说明继承关系,只需要将父类的名称放在括号中就可以了,看起来要比 java 简洁一些。

  父类和子类的初始化函数调用

  前面讲过, python class 中可以定义自己的初始化函数,在实例化的时会被调用。那如果父类和子类都有初始化函数或者父类有而子类没有,那初始化函数该如何执行呢?这里分为三种情况来说明,先来看第一种。

  第一种情况,

  父类有 init 而子类没有, 这时父类的初始化函数会被默认调用

  class Father():

  """ 这是一个父类 """

  def __init__(self, age):

  print("Father's init function invoke")

  self.__age = age

  class Son(Father):

  """ 这是一个子类 """

  son = Son(5)

  这里要注意,父类中需要的 age 参数一定要传进去哦,要不然会报错的。

  第二种情况

  父类,子类都有 init ,而子类没有显式调用父类的 init 方法时,父类初始化函数是不会被调用的

  class Father():

  """ 这是一个父类 """

  def __init__(self, age):

  print("Father's init function invoke")

  self.__age = age

  def get_age(self):

  return self.__age

  class Son(Father):

  """ 这是一个子类 """

  def __init__(self, age):

  print("Son's init function invoke")

  self.__age = age

  son = Son(5) # Son's init function invoke

  print(son.get_age()) # AttributeError: 'Son' object has no attribute '_Father__age'

  细心的同学会发现,代码中的最后一句报错了,表示 Son 对象没有 Father 类的 __age 变量。这是因为

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

  父类的初始化函数没有执行,父类的 __age 变量则没有初始化

  get_age 函数是被子类从父类继承来的,返回的是父类的 __age 变量

  那我要是想解决这个错误,该怎么做呢?有两种方法

  在子类 Son 的初始化函数中显式调用父类 Father 的初始化函数

  在子类 Son 中重新定义个 get_age 方法,这样就会覆盖父类的同名方法,返回的是子类的 _age 变量

  第二种方法就不贴代码了,感兴趣的话可以试试。重点来看第一种方法,这就引出了第 3 种情况。

  第三种情况

  子类在自己定义的 init 方法中,显式调用父类的 init 方法,父类和子类的属性都会被初始化

  class Father():

  """ 这是一个父类 """

  def __init__(self, age):

  print("Father's init function invoke")

  self.__age = age

  def get_age(self):

  return self.__age

  class Son(Father):

  """ 这是一个子类 """

  def __init__(self, age):

  print("Son's init function invoke")

  self.__age = age

  super(Son, self).__init__(age + 25)

  def get_age(self):

  return self.__age

  def get_father_age(self):

  return super(Son, self).get_age()

  son = Son(5)

  # Son's init function invoke

  # Father's init function invoke

  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() 这种简写的形式。

  来看代码

  class Father():

  """ 这是一个父类 """

  def __init__(self, age):

  print("Father's init function invoke")

  self.__age = age

  def get_age(self):

  return self.__age

  class Son(Father):

  """ 这是一个子类 """

  def __init__(self, age):

  print("Son's init function invoke")

  self.__age = age

  super(Son, self).__init__(age + 25)

  def get_age(self):

  return self.__age

  def get_father_age(self):

  return super(Son, self).get_age()

  son = Son(5)

  # Son's init function invoke

  # Father's init function invoke

  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相关知识,请关注多测师。https://www.e70w.com/xwzx/

返回列表
在线客服
联系方式

热线电话

17727591462

上班时间

周一到周五

二维码
线