python---继承
·
文章目录
继承是面向对象编程的核心概念之一,它允许一个类(子类)继承另一个类(父类)的属性和方法。
基本语法
class ParentClass:
# 父类的属性和方法
pass
class ChildClass(ParentClass): # 继承父类
# 子类的属性和方法
pass
继承的类型
1. 单继承
class A:
pass
class B(A): # B继承A
pass
2. 多继承
class A:
pass
class B:
pass
class C(A, B): # C同时继承A和B
pass
3.多级继承(Multilevel Inheritance)
多级继承是指一个类继承自另一个类,而这个父类又继承自另一个类,形成层级结构。
class Grandparent:
def grandparent_method(self):
print("Grandparent method")
class Parent(Grandparent):
def parent_method(self):
print("Parent method")
class Child(Parent):
def child_method(self):
print("Child method")
# 使用示例
child = Child()
child.grandparent_method() # 可以调用祖父类的方法
child.parent_method() # 可以调用父类的方法
child.child_method() # 可以调用自己的方法
方法重写
class Animal:
def make_sound(self):
print("Animal makes a sound")
def eat(self):
print("Animal is eating")
class Dog(Animal):
# 重写父类的 make_sound 方法
def make_sound(self):
print("Dog barks: Woof! Woof!")
# 不重写 eat 方法,继承父类的实现
# 使用示例
animal = Animal()
animal.make_sound() # Animal makes a sound
dog = Dog()
dog.make_sound() # Dog barks: Woof! Woof! (重写的方法)
dog.eat() # Animal is eating (继承的方法)
方法扩展
调用父类,在父类基础上做扩展。
class Animal:
def make_sound(self):
print("Animal makes a sound")
def sleep(self):
print("Animal is sleeping")
class Dog(Animal):
def make_sound(self):
# 先调用父类的方法
super().make_sound()
# 然后添加新的功能
print("Dog barks: Woof! Woof!")
print("Tail is wagging")
# 使用示例
dog = Dog()
dog.make_sound()
# 输出:
# Animal makes a sound
# Dog barks: Woof! Woof!
# Tail is wagging
方法解析顺序(MRO)
Python使用C3算法来确定方法解析顺序:
class A:
def method(self):
return "A的方法"
class B(A):
def method(self):
return "B的方法"
class C(A):
def method(self):
return "C的方法"
class D(B, C):
pass
# 查看MRO
print(D.__mro__)
# 输出: (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
d = D()
print(d.method()) # 输出: "B的方法"(按照MRO顺序)
特殊方法super
super()函数
python中有显式调用方法:super(子类名, self).方法()
用于调用父类的方法:
class Parent:
def __init__(self, value):
self.value = value
class Child(Parent):
def __init__(self, value, extra):
super().__init__(value) # 调用父类的__init__
self.extra = extra
继承的实用技巧
1. 检查继承关系
print(issubclass(Dog, Animal)) # True 检查类与类之间的继承关系
print(isinstance(my_dog, Animal)) # True 检查对象与类之间的关系
2. 抽象基类(ABC)
from abc import ABC, abstractmethod
class Shape(ABC): # 抽象基类
@abstractmethod
def area(self):
pass
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self): # 必须实现抽象方法
return 3.14 * self.radius ** 2
注意事项
1、谨慎使用多继承:可能导致复杂的MRO和难以维护的代码
2、优先使用组合而不是继承:如果"有一个"关系比"是一个"关系更合适
3、遵循Liskov替换原则:子类应该能够替换父类而不影响程序正确性
更多推荐

所有评论(0)