Python面向对象编程:深入解析继承与多态机制
本文深入解析Python面向对象编程中的继承与多态。详细讲解如何定义子类继承父类属性与方法,通过isinstance和issubclass判断类型关系。重点阐述多态机制,包括子类重写父类方法实现行为差异,以及子类在新增属性时如何正确调用父类构造函数。最后介绍多重继承的优先级规则,帮助开发者理解并应用开闭原则进行可扩展的代码设计。
本文通过具体实例,详细解析Python面向对象编程中继承与多态的核心用法,旨在为读者提供清晰的参考与实践指导。
Python类的继承与多态基础
Python类的继承机制
Python类的继承机制
在面向对象编程(OOP)中,定义新类时可以从现有类继承,新类称为子类(Subclass),被继承的类称为基类、父类或超类(Base class、Super class)。
首先定义一个Person类,包含name(姓名)和sex(性别)两个属性变量。
接着定义print_title()方法:当sex为male时输出man,当sex为female时输出woman。具体代码实现如下:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person): # Child 继承 Person
pass
May = Child("May","female")
Peter = Person("Peter","male")
print(May.name,May.sex,Peter.name,Peter.sex) # 子类继承父类方法及属性
May.print_title()
Peter.print_title()
编写Child类时,可直接继承Person类(即Child是Person的一种)。通过class subclass_name(baseclass_name)语法表示继承关系。
继承的最大优势在于子类自动获得父类的所有属性和功能。例如,Child类无需额外定义即可直接使用父类的print_title()方法。
实例化Child对象时,由于子类继承了父类的构造函数,必须提供父类Person所要求的两个属性变量name和sex。
在继承关系中,若实例的数据类型是某个子类,则该实例也可视为父类(如May既是Child也是Person)。反之不成立(Peter仅是Person,而非Child)。
继承支持多级传递,如同从爷爷到父亲再到儿子的关系。任何类最终都可追溯至根类object,这种层级关系形似倒置的树。例如以下继承树结构:

isinstance()及issubclass()函数用法
isinstance()及issubclass()函数用法
Python与其他语言不同,定义class时即定义了一种数据类型。自定义数据类型与Python内置类型(如str、list、dict)并无本质区别。
Python提供两个判断继承关系的函数:isinstance()用于检查实例类型,issubclass()用于检查类继承关系。参考示例如下:
class Person(object):
pass
class Child(Person): # Child 继承 Person
pass
May = Child()
Peter = Person()
print(isinstance(May,Child)) # True
print(isinstance(May,Person)) # True
print(isinstance(Peter,Child)) # False
print(isinstance(Peter,Person)) # True
print(issubclass(Child,Person)) # True
Python类的多态特性
Python类的多态特性
在解释多态前,先在Child类中重写print_title()方法:若sex为male则输出boy,若sex为female则输出girl。
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person): # Child 继承 Person
def print_title(self):
if self.sex == "male":
print("boy")
elif self.sex == "female":
print("girl")
May = Child("May","female")
Peter = Person("Peter","male")
print(May.name,May.sex,Peter.name,Peter.sex)
May.print_title()
Peter.print_title()
当子类与父类存在同名的print_title()方法时,子类的实现会覆盖父类的实现。代码运行时,将调用子类的print_title()方法。
由此获得继承的另一个重要好处:多态。
多态的优势在于,当需要传入更多子类(如新增Teenagers、Grownups等)时,只需继承Person类型即可。print_title()方法可选择直接继承父类(不重写),或重写为特有逻辑。调用方只需关注调用行为,无需关心内部细节。新增Person子类时,只要确保新方法编写正确,无需修改原有代码。这体现了著名的“开闭”原则:
- 对扩展开放(Open for extension):允许子类重写方法函数
- 对修改封闭(Closed for modification):不重写时直接继承父类方法函数
子类重写构造函数
子类重写构造函数
子类可不定义构造函数(与父类一致),也可重写构造函数。若需在子类Child中新增mother和father两个属性变量,构造方式如下(建议子类调用父类构造方法,见后续代码):
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
class Child(Person): # Child 继承 Person
def __init__(self,name,sex,mother,father):
self.name = name
self.sex = sex
self.mother = mother
self.father = father
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)
Person
若父类构造函数包含大量属性,而子类仅需新增1、2个,直接重写会导致代码冗余。此时,子类可显式调用父类的构造方法,参考实现如下:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
class Child(Person): # Child 继承 Person
def __init__(self,name,sex,mother,father):
Person.__init__(self,name,sex) # 子类对父类的构造方法的调用
self.mother = mother
self.father = father
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)
多重继承
多重继承
多重继承概念直观,例如新建Baby类继承Child,可继承父类及父类上层类的属性与方法。执行时优先使用层级较近的方法,代码参考如下:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person):
pass
class Baby(Child):
pass
May = Baby("May","female") # 继承上上层父类的属性
print(May.name,May.sex)
May.print_title() # 可使用上上层父类的方法
class Child(Person):
def print_title(self):
if self.sex == "male":
print("boy")
elif self.sex == "female":
print("girl")
class Baby(Child):
pass
May = Baby("May","female")
May.print_title() # 优先使用上层类的方法
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









