在面向对象编程中,有一个名为继承的功能,它允许一个新类继承现有类的属性和方法。通过使用继承,您不必总是重新发明轮子,这也意味着您的代码将更加简洁,更易于阅读和调试。
首先,什么是类?
将类想象成创建对象的蓝图,以及定义与从类创建的对象相关的属性(属性)和行为(方法)。类就像一个模板,您可以在代码中使用和重复使用。
继承需要两种类型的类:
基类(又名父类):这是将继承其属性和方法的类。派生类(又名子类):这是继承属性和方法的类。
有五种类型的继承:
单继承: 派生类从单个基类继承。
多继承: 派生类从多个基类继承。
多级继承: 一个类从一个类派生,而该类又从另一个类派生。
层次继承: 多个类从单个基类派生。
混合继承: 两种或多种继承类型的组合。
使用继承的好处包括:
代码可重用性
可扩展性
更好的代码组织
类继承的基本语法如下所示:
class baseClass: # Base class attributes and methods class derivedClass(baseClass) # Derived class attributes and methods
让我们先创建一个基类。这将使用我在本Python系列中概述的几个概念。
我们将创建一个定义人名并类似于此的基类:
class Person: def __init__(fullName, fname, lname): fullName.firstname = fname fullName.lastname = lname def printname(fullName): print(fullName.firstname, fullName.lastname)
现在我们已经创建了类,我们使用它来创建对象并像这样打印对象:
x = Person("Jack", "Wallen") x.printname()
将所有这些放在一起,它看起来像这样:
class Person: def __init__(fullName, fname, lname): fullName.firstname = fname fullName.lastname = lname def printname(fullName): print(fullName.firstname, fullName.lastname) x = Person("Jack", "Wallen") x.printname()
运行上面的命令,它将打印“Jack Wallen”。
那是基类。我们创建了一个派生类,它继承了基类(Person)的属性和方法。这是简单部分。我们将创建一个名为 Staff 的新类,它继承自 Person。该类看起来像这样:
class Staff(Person): pass
通过使用pass
,我们通知 Python 我们没有向新类添加任何新属性或方法。
然后我们可以像这样从派生类创建一个新对象:
x = Staff("Olivia", "Nightingale")
使用以下方法打印新对象:
整个代码现在看起来像这样:
class Person: def __init__(fullName, fname, lname): fullName.firstname = fname fullName.lastname = lname def printname(fullName): print(fullName.firstname, fullName.lastname) x = Person("Jack", "Wallen") x.printname() class Staff(Person): pass x = Staff("Olivia", "Nightingale") x.printname()
运行上面的代码,它将打印:
Jack Wallen Olivia Nightingale
请记住,我们之前使用pass
是因为我们不想向新类添加任何新属性或方法。现在,我们将向新类添加新属性和方法。我们将坚持与我们的原始类类似的东西 - 我们的基类。这次,基类是:
class Person(object): def __init__(fullName, name): fullName.name = name def getName(fullName): return fullName.name def isEmployee(fullName): return False
我们在上面添加了两个新函数,getName
(返回人的全名)和isEmployee
(假设isEmployee
等于 false)。
接下来,我们将创建一个派生类来定义isEmployee
等于 True,它看起来像这样:
class Employee(Person): def isEmployee(fullName): return True
到目前为止,我们有一个名为 Person 的类和一个名为 Employee 的类。正如您可能假设的那样,Person 不是员工,而 Employee 是。您将在下面看到它的实际应用:
emp = Person("Jack Wallen") print(emp.getName(), emp.isEmployee()) emp = Employee("Olivia Nightingale") print(emp.getName(), emp.isEmployee())
你应该能够猜到会发生什么。由于 Jack Wallen 是 Person 类的对象,因此他不会被列为员工,而 Olivia Nightingale 是 Employee 类的对象,因此会被列为员工。 整个代码如下:
class Person(object): def __init__(self, fullName, name): self.name = name def getName(self): return self.name def isEmployee(self): return False class Employee(Person): def isEmployee(self): return True emp = Person("Jack Wallen") print(emp.getName(), emp.isEmployee()) emp = Employee("Olivia Nightingale") print(emp.getName(), emp.isEmployee())
运行上面的代码,输出将是:
Jack Wallen False Olivia Nightingale True
很不错,对吧?
使用 super() 函数
还有super()
函数,它强制派生类继承基类中的所有属性和方法。这次,我们将重点关注学生及其毕业年份。
super()
函数的使用方法如下:
class Student(Person): def __init__(self, fullName, fname, lname, year): super().__init__(fname, lname) self.graduationyear = year
super()
函数(在上面的示例中)的解释是:
super()
:返回超类的临时对象,允许调用其方法__init__()
:用于初始化新对象的 Python 构造函数方法(fname, lname)
:传递给超类构造函数的参数
我们的整个代码如下:
class Person: def __init__(self, fullName, fname, lname): self.firstname = fname self.lastname = lname def printname(self): print(self.firstname, self.lastname) class Student(Person): def __init__(self, fullName, fname, lname, year): super().__init__(fname, lname) self.graduationyear = year def welcome(self): print("Welcome", self.firstname, self.lastname, "to the class of", self.graduationyear) x = Student("Jack", "Wallen", 2026) x.welcome()
运行上面的代码,输出将是:
Welcome Jack Wallen to the class of 2026
这就是 Python 继承的基础知识。要了解更多关于继承的信息,请查看关于该主题的官方 Python 文档。
本教程解释了 Python 中的继承,它允许您定义一个类,该类继承另一个类中的所有方法和属性。
译自How To Use Inheritance in Python,作者 Jack Wallen。