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)    # 报错

三大特性总结

封装:把属性 / 方法藏起来
继承:子类复用父类代码
多态:同一方法,不同表现

更多推荐