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支持多继承,但是尽量还是不要滥用,除了使代码变得复杂之外,一个一个地找父类的方法还会降低性能。