面向对象编程篇(三)

派生

在Python中,类的派生(也称为继承)是指创建一个新的类,它继承自一个或多个已存在的类。这允许我们重用和扩展已存在的类的代码,而无需从头开始编写。

以下是一个简单的Python派生类的例子:

# 父类(基类)
class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        raise NotImplementedError("子类必须实现此方法")

# 子类(派生类)
class Dog(Animal):
    def speak(self):
        return "汪汪汪"

# 另一个子类
class Cat(Animal):
    def speak(self):
        return "喵喵喵"

# 实例化对象
dog = Dog("小狗")
cat = Cat("小猫")

print(dog.name)  # 输出:小狗
print(cat.name)  # 输出:小猫

print(dog.speak())  # 输出:汪汪汪
print(cat.speak())  # 输出:喵喵喵

在上面的例子中,Animal是一个父类,它定义了一个speak方法,但是并没有实现。然后,我们创建了两个子类Dog和Cat,它们都继承自Animal,并实现了speak方法。这样,Dog和Cat对象就可以调用speak方法了。

Python还支持多重继承,即一个类可以继承自多个父类。例如:

class FlyingAnimal(Animal):
    def fly(self):
        raise NotImplementedError("子类必须实现此方法")

class Bird(FlyingAnimal, Dog):
    def speak(self):
        return "叽叽喳喳"

    def fly(self):
        return "飞高高"

bird = Bird("小鸟")
print(bird.speak())  # 输出:叽叽喳喳
print(bird.fly())    # 输出:飞高高

在这个例子中,Bird类同时继承自FlyingAnimal和Dog类,所以它既有Dog类的speak方法,也有FlyingAnimal类的fly方法。当然,它也可以选择性地重写或扩展这些方法。

这就是Python中类的派生的基本概念。通过继承,我们可以更方便地组织和管理代码,实现代码的复用和扩展。

继承

在Python中,类的继承是面向对象编程的一个重要特性,它允许我们创建一个新的类(子类或派生类)来继承另一个类(父类或基类)的属性和方法。子类继承父类的所有非私有属性和方法,同时还可以定义自己特有的属性和方法。

下面是一个简单的Python类继承的例子:

# 父类
class Parent:
    def __init__(self):
        self.parent_attribute = "I am from Parent class"

    def parent_method(self):
        print("This is a method from Parent class")

# 子类
class Child(Parent):
    def __init__(self):
        super().__init__()  # 调用父类的初始化方法
        self.child_attribute = "I am from Child class"

    def child_method(self):
        print("This is a method from Child class")

# 实例化子类对象
c = Child()

# 访问父类属性
print(c.parent_attribute)  # 输出: I am from Parent class

# 访问子类属性
print(c.child_attribute)  # 输出: I am from Child class

# 调用父类方法
c.parent_method()  # 输出: This is a method from Parent class

# 调用子类方法
c.child_method()  # 输出: This is a method from Child class

在这个例子中,Child 类继承了 Parent 类。当我们创建 Child 类的实例 c 时,c 既有 Parent 类的属性 parent_attribute 和方法 parent_method(),也有 Child 类自己定义的属性 child_attribute 和方法 child_method()。

使用 super().init() 是为了调用父类的 init 方法,确保父类的初始化代码也被执行。这是继承中常见的做法,特别是当父类中有一些必要的初始化步骤时。

此外,Python还支持多重继承,即一个类可以继承自多个父类。这可以通过在类定义时列出多个基类来实现,如下所示:

class Base1:
    pass

class Base2:
    pass

class Derived(Base1, Base2):
    pass

在这个例子中,Derived 类继承自 Base1 和 Base2 两个类。如果子类中有与多个父类相同的方法,Python会按照方法解析顺序(MRO,Method Resolution Order)来调用该方法。

类继承不仅是代码重用的一种手段,还是实现多态性(一个接口,多种实现)的关键机制。通过继承,我们可以构建更加灵活和可扩展的软件系统。

多重继承

在Python中,类可以继承自多个父类,这种机制称为多重继承。多重继承允许一个类从多个父类中获取属性和方法。然而,当多个父类中有相同名称的方法时,就需要解决方法调用的顺序问题,这通常通过方法解析顺序(MRO,Method Resolution Order)来确定。

Python使用一种称为C3线性化算法来确定MRO,该算法保证了继承关系的一致性和可预测性。

下面是一个多重继承的例子:

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

# 创建一个D类的实例
d = D()

# 调用method方法
print(d.method())  # 输出将是B类的method方法,根据MRO确定

在这个例子中,D类继承自B和C,而B和C都继承自A。如果我们调用d.method(),Python将根据MRO确定应该调用哪个父类的method方法。

为了查看一个类的MRO,我们可以使用内置的mro()方法:

print```(D.mro())

这将输出D类的MRO列表,类似于:

[<class ‘main.D’>, <class ‘main.B’>, <class ‘main.C’>, <class ‘main.A’>, <class ‘object’>]

在这个列表中,D类在最前面,然后是它的直接父类B和C,接着是B和C的共同父类A,最后是所有类的基类object。根据这个MRO列表,当D类实例调用method方法时,Python会首先在D类中查找,如果找不到,就会按照MRO列表的顺序在父类中查找,直到找到为止。

多重继承可以带来很大的灵活性,但也可能会引入复杂性,特别是当需要处理复杂的继承关系和方法覆盖时。因此,在使用多重继承时,要特别注意确保代码的清晰性和可维护性。

  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊猫Devin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值