Python的继承与多态
·
Python继承的基本概念
继承是面向对象编程的重要特性,允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以复用父类的代码,并扩展或修改父类的行为。
语法示例:
class ParentClass:
def parent_method(self):
print("Parent method")
class ChildClass(ParentClass):
def child_method(self):
print("Child method")
继承的类型
单继承
一个子类只继承一个父类,这是最简单的继承形式。
多继承
Python支持多继承,一个子类可以继承多个父类。多继承的语法是用逗号分隔多个父类。
class Father:
def father_method(self):
print("Father method")
class Mother:
def mother_method(self):
print("Mother method")
class Child(Father, Mother):
pass
方法重写
子类可以重写父类的方法,以提供特定的实现。当子类对象调用该方法时,将执行子类中的版本。
class Parent:
def method(self):
print("Parent method")
class Child(Parent):
def method(self):
print("Child method")
super()函数
super()函数用于调用父类的方法,常用于方法重写时扩展父类行为而非完全替代。
class Parent:
def method(self):
print("Parent method")
class Child(Parent):
def method(self):
super().method()
print("Child method")
Python多态的基本概念
多态指同一操作作用于不同对象时,可以有不同的解释和执行结果。在Python中,多态通过方法重写和鸭子类型实现。
多态特点
不需要强制继承关系(鸭子类型)
只要有同名方法,就能传进去
非常灵活
鸭子类型
Python的多态主要依赖于鸭子类型(Duck Typing),即“如果它走起来像鸭子,叫起来像鸭子,那么它就是鸭子”。不关心对象的类型,只关心对象的行为。
class Dog:
def speak(self):
return "Woof!"
class Cat:
def speak(self):
return "Meow!"
def animal_sound(animal):
print(animal.speak())
dog = Dog()
cat = Cat()
animal_sound(dog) # 输出: Woof!
animal_sound(cat) # 输出: Meow!
抽象基类(ABC)
虽然Python支持鸭子类型,但有时需要强制子类实现特定方法。abc模块提供了抽象基类的支持。
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Woof!"
# 未实现speak方法会报错
class Cat(Animal):
pass
多态与继承的结合
多态常与继承结合使用,子类重写父类方法以实现不同行为。
class Animal:
def speak(self):
raise NotImplementedError("Subclass must implement abstract method")
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
animals = [Dog(), Cat()]
for animal in animals:
print(animal.speak())
方法解析顺序(MRO)
在多继承中,Python使用C3线性化算法确定方法查找顺序,可通过__mro__属性或mro()方法查看。
class A:
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
print(D.__mro__)
继承中的属性访问
子类可以访问父类的属性和方法,私有属性(以__开头)会被名称修饰(name mangling),无法直接访问。
class Parent:
def __init__(self):
self.public = "Public"
self.__private = "Private"
class Child(Parent):
def show(self):
print(self.public) # 可访问
print(self.__private) # 报错
三大特性总结
封装:把属性 / 方法藏起来
继承:子类复用父类代码
多态:同一方法,不同表现
更多推荐



所有评论(0)