类的继承
基本继承
子类继承父类的属性和方法,并可以添加新功能或重写
class Animal:
"""动物基类"""
def __init__(self, name):
self.name = name
def make_sound(self):
"""发出声音"""
print(f"{self.name}发出了声音")
# 继承 Animal 类
class Dog(Animal):
"""狗类"""
sound = "汪汪汪"
def __init__(self, name):
# 调用父类构造方法
Animal.__init__(self, name)
# 重写父类方法
def make_sound(self):
"""狗叫"""
# 调用父类方法
super().make_sound()
print(Dog.sound)
dog = Dog("旺财")
dog.make_sound() # 旺财发出了声音 汪汪汪
多重继承
Python支持多重继承,但要注意方法解析顺序(MRO):
class Animal:
"""动物基类"""
def __init__(self, name):
self.name = name
def make_sound(self):
"""发出声音"""
print(f"{self.name}发出了声音")
class Swimmer:
"""游泳能力混入类"""
def swim(self):
print("在水中游泳")
class Duck(Animal, Swimmer):
"""鸭类"""
sound = "嘎嘎嘎"
def __init__(self, name):
Animal.__init__(self, name)
# 不需要调用Swimmer的__init__,因为它没有
def make_sound(self):
"""鸭叫"""
super().make_sound()
print(Duck.sound)
duck = Duck("小鸭子")
duck.make_sound() # 小鸭子发出了声音 嘎嘎嘎
duck.swim() # 在水中游泳
抽象方法(接口)
使用abc
模块创建抽象基类,强制子类实现特定方法:
from abc import ABC, abstractmethod
class Shape(ABC):
"""形状抽象基类"""
def __init__(self, name):
self.name = name
@abstractmethod
def calculate_area(self):
"""抽象方法 - 子类必须实现"""
pass
def display_info(self):
"""具体方法 - 子类可以直接使用"""
area = self.calculate_area()
print(f"{self.name}: 面积={area:.2f}")
class Rectangle(Shape):
def __init__(self, width, height):
super().__init__("矩形")
self.width = width
self.height = height
def calculate_area(self):
return self.width * self.height
# 使用抽象基类
rectangle = Rectangle(5, 3)
rectangle.display_info() # 矩形: 面积=15.00, 周长=16.00
# 尝试直接实例化抽象基类会报错
# shape = Shape("测试") # TypeError: Can't instantiate abstract class Shape
版本说明:
abc
模块在Python 2.6+可用,但ABC
类在Python 3.4+中更加完善。