3

Python中的继承

 9 months ago
source link: https://xugaoxiang.com/2023/09/24/python-inherit/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Python中的继承 - 迷途小书童的Note迷途小书童的Note

当我们学习编程时,经常会遇到需要重复编写相似功能的情况。为了避免重复劳动,Python 提供了一种称为 继承 的特性,它允许我们创建一个新的类,该类可以继承已有类的属性和方法。这样,我们就可以在不重复编写相同代码的情况下,扩展和定制现有类的功能。

让我们以一个简单的例子来说明继承的原理。假设我们正在编写一个游戏,其中有不同类型的角色,比如战士、法师和盗贼。这些角色都有一些共同的属性和行为,比如生命值、攻击力和移动方法。我们可以创建一个名为 角色 的基类,它包含这些共同的属性和方法。



  1. class Character:
  2. def __init__(self, name, health, attack):
  3. self.name = name
  4. self.health = health
  5. self.attack = attack
  6. def move(self):
  7. print(f"{self.name} is moving.")

在上面的代码中,我们定义了一个名为 Character 的类,它有三个属性:name(角色名)、health(生命值)和 attack(攻击力)。还有一个名为 move 的方法,用于移动角色。

现在,我们可以创建具体的角色类,比如战士、法师和盗贼。这些类可以继承 Character 类的属性和方法,并可以添加自己特有的属性和方法。



  1. class Warrior(Character):
  2. def __init__(self, name, health, attack, weapon):
  3. super().__init__(name, health, attack)
  4. self.weapon = weapon
  5. def attack_enemy(self):
  6. print(f"{self.name} is attacking with {self.weapon}.")
  7. class Mage(Character):
  8. def __init__(self, name, health, attack, spell):
  9. super().__init__(name, health, attack)
  10. self.spell = spell
  11. def cast_spell(self):
  12. print(f"{self.name} is casting {self.spell}.")
  13. class Rogue(Character):
  14. def __init__(self, name, health, attack, stealth):
  15. super().__init__(name, health, attack)
  16. self.stealth = stealth
  17. def use_stealth(self):
  18. print(f"{self.name} is using stealth.")

在上面的代码中,我们定义了三个具体的角色类:战士(Warrior)、法师(Mage)和盗贼(Rogue)。这些类都继承了 Character 类,并在自己的构造函数中调用了父类的构造函数(使用 super() 函数)。然后,它们分别添加了自己特有的属性和方法。

现在,我们可以创建具体的角色对象,并调用它们的方法。



  1. warrior = Warrior("Garen", 100, 20, "Sword")
  2. warrior.move()
  3. warrior.attack_enemy()
  4. mage = Mage("Veigar", 80, 10, "Fireball")
  5. mage.move()
  6. mage.cast_spell()
  7. rogue = Rogue("Evelynn", 90, 15, "Invisibility")
  8. rogue.move()
  9. rogue.use_stealth()

在上面的代码中,我们创建了一个战士对象、一个法师对象和一个盗贼对象。我们可以看到,这些对象都可以调用从基类 Character 继承而来的 move 方法,同时也可以调用自己特有的方法。

继承的原理就像是我们从父母那里继承了一些基因和特征,然后在自己的基础上进行了一些定制。通过继承,我们可以避免重复编写相同的代码,提高代码的可重用性和可维护性。

当我们谈到多重继承时,可以想象成一个孩子继承了多个父母的特征。在 Python 中,我们可以创建一个类,让它继承自多个父类,以获取这些父类的属性和方法。

让我们通过一个简单的比喻来理解多重继承的原理。假设有一个动物园,里面有各种各样的动物,比如狗、猫和鸟。我们可以将这些动物看作是不同的类,每个类都有自己的特征和行为。

现在,假设我们想创建一个新的类,叫做 狗鸟,它既有狗的特征,又有鸟的特征。在 Python 中,我们可以使用多重继承来实现这个目标。

首先,我们定义一个 类,它有自己的特征和方法,比如



  1. class Dog:
  2. def bark(self):
  3. print("Woof woof!")
  4. def run(self):
  5. print("Running like a dog!")

然后,我们定义一个 类,它也有自己的特征和方法,比如



  1. class Bird:
  2. def chirp(self):
  3. print("Chirp chirp!")
  4. def fly(self):
  5. print("Flying like a bird!")

现在,我们可以创建一个 狗鸟 类,让它同时继承自 类和 类,以获取它们的特征和方法



  1. class DogBird(Dog, Bird):
  2. pass

在这个例子中,我们使用逗号将父类分隔开来,表示 狗鸟 类继承自 类和 类。然后,我们使用关键字 pass 来表示这个类没有额外的特征或方法。

现在,我们可以创建一个 狗鸟 对象,并调用它继承自父类的方法:



  1. dog_bird = DogBird()
  2. dog_bird.bark() # 输出: Woof woof!
  3. dog_bird.chirp() # 输出: Chirp chirp!
  4. dog_bird.run() # 输出: Running like a dog!
  5. dog_bird.fly() # 输出: Flying like a bird!

通过多重继承,狗鸟 类继承了 类和 类的特征和方法,使得它既能像狗一样叫和跑,又能像鸟一样叫和飞。

需要注意的是,多重继承可能会导致一些设计上的复杂性。例如,如果 类和 类都有一个相同的方法,那么在 狗鸟 类中调用这个方法时,会使用哪个父类的方法呢?Python 使用 C3 线性化算法来解决这个问题,确定方法的调用顺序。

另外,多重继承也需要谨慎使用,以避免代码的混乱和不必要的复杂性。在设计类的继承关系时,需要考虑代码的可读性和维护性。合理使用多重继承可以提高代码的复用性和灵活性,但滥用多重继承可能导致代码的混乱和难以理解。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK