【Python】继承、父类、子类、方法重写、子类调用父类方法、super()函数、多继承

Python继承

2021/6/21 周一
学习内容:父类、子类、方法重写、子类调用父类方法、super()函数、多继承

Python入门,主要是看 菜鸟教程w3school 网站,以及电子工业出版社出版的Python编程入门指南上册的教材,并根据自己的情况对重点内容做的笔记。

如有错误,欢迎在评论区指出,非常感谢!


Python也支持类的继承,继承是面向对象编程的重要特性之一

当要编写的类和另一个已经存在的类之间存在一定继承关系时,就可以通过继承来达到代码重用的目的,提高开发效率。

父类是继承的类,也称为基类。任何类都可以是父类。

子类是从另一个类继承的类,也称为派生类。子类继承父类的所有方法和属性

1. 创建子类

比如说有一个父类Person类:

class Person:
  def __init__(self, fname, lname):
    self.firstname = fname
    self.lastname = lname

  def printname(self):
    print(self.firstname, self.lastname)

要创建一个 Student 类来继承 Person 类,需要在创建子类时将父类作为类似参数的形式发送

class Student(Person):
  pass

(如果没想好子类需要什么其他属性或方法,可以先用 pass 关键字。)

这样就可以使用 Student 类来创建对象,并且调用它从 Person 类继承过来的 printname() 方法了:

x = Student("Hanne", "Lovegood")
x.printname()

>>> 输出:
>>> Hanne Lovegood

2. 方法重写

上面的子类是直接继承了父类的属性和方法,如果父类中的方法不完全适用于子类,也可以在子类中重写父类的这个方法

比如 Student 重写 Person 的构造方法:

class Student(Person):
  def __init__(self, fname, lname):
    self.firstname = fname + ' _'
    self.lastname = lname

注意 lastname 属性虽然没有改变,但是不能省略,否则会报错 Student没有lastname 属性。

因为这两个属性都是写在父类的构造方法中的,如果子类有自己的构造方法了,就会覆盖掉父类的,也就没有继承到这两个属性了。

如果想要都继承到属性,不如把属性定义在方法外面,也就是作为类属性:

class Person:
  firstname = ''
  lastname = ''
  def __init__(self, fname, lname):
    self.firstname = fname
    self.lastname = lname

这样即使子类重写了方法,也能继承到父类的这两个属性了。

3. 子类调用父类方法

或者想在继承父类构造方法的基础上,再做改动,可以用父类的类名先调用父类的构造方法:

class Student(Person):
  def __init__(self, fname, lname):
    Person.__init__(self, fname, lname)
    self.firstname = fname + ' _'

x = Student("Hanne", "Lovegood")
x.printname()
>>> Hanne _ Lovegood

这样就是子类先从父类构造方法中获得了这两个属性,然后再修改 firstname 。

还可以使用 super() 函数来继承父类方法和属性,不用写父类的名称,也不用写第一个self参数

class Student(Person):
  def __init__(self, fname, lname):
    super().__init__(fname, lname)
    self.firstname = fname + ' _'

这样也是子类从父类继承了这两个属性,效果与使用上面使用Person.的一样。

4. 多继承

Python支持多继承。

需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索,后面的将被忽略

比如下面 Name 和 Age 中都有一个 prininfo() 方法:

class Name:
  def __init__(self, fname, lname):
    self.firstname = fname
    self.lastname = lname

  def printinfo(self):
    print("My name is", self.firstname, self.lastname, ".")

class Age():
  def __init__(self, age):
    self.age = age
    
  def printinfo(self):
    print("I'm ", self.age)

class Info(Name, Age):
  def __init__(self, fname, lname, age):
    Name.__init__(self, fname, lname)
    Age.__init__(self, age)
    print("Self Introduction:")

x = Info("Hanne", "Lovegood", 23)
x.printinfo()

>>> 输出:
>>> Self Introduction:
>>> My name is Hanne Lovegood .

从输出可以看出,只调用了 Name 的 printinfo() 方法,因为继承时 Name 写在 age 前面。

虽然Python支持多继承,但是尽量还是不要滥用,除了使代码变得复杂之外,一个一个地找父类的方法还会降低性能。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值