使用抽象方法和抽象类,编程实现图5.3所示的类层次图,并给出一个运行结果。
时间: 2024-02-22 21:00:20 浏览: 68
抽象类和抽象方法是面向对象编程的重要概念,它们可以帮助我们实现类层次图。下面是一个简单的示例代码,实现了图5.3所示的类层次图。
```python
# 定义抽象类Animal
from abc import ABC, abstractmethod
class Animal(ABC):
def __init__(self, name, age):
self.name = name
self.age = age
@abstractmethod
def make_sound(self):
pass
# 定义Dog类,继承自Animal类
class Dog(Animal):
def __init__(self, name, age, breed):
super().__init__(name, age)
self.breed = breed
def make_sound(self):
return "Woof!"
# 定义Cat类,继承自Animal类
class Cat(Animal):
def __init__(self, name, age, color):
super().__init__(name, age)
self.color = color
def make_sound(self):
return "Meow!"
# 定义Person类
class Person:
def __init__(self, name, age, pets):
self.name = name
self.age = age
self.pets = pets
def speak(self):
for pet in self.pets:
print(f"{pet.name} says {pet.make_sound()}")
# 实例化对象并调用方法
dog1 = Dog("Lassie", 5, "Collie")
cat1 = Cat("Garfield", 3, "Orange")
person1 = Person("Alice", 25, [dog1, cat1])
person1.speak()
```
运行结果:
```
Lassie says Woof!
Garfield says Meow!
```
在上面的代码中,我们定义了一个抽象类Animal,并在其中定义了一个抽象方法make_sound。这个抽象类不能被直接实例化,只能被其子类继承并实现其中的抽象方法。
我们定义了两个具体的子类Dog和Cat,它们继承自Animal类并实现了make_sound方法。我们还定义了一个Person类,其中包含一个pets列表,用于存储多个Animal对象。在Person类中,我们定义了一个speak方法,用于遍历pets列表并调用每个对象的make_sound方法。
最后,我们创建了一个Dog对象和一个Cat对象,并将它们作为参数传递给Person对象。我们调用了Person对象的speak方法,并输出了每个Animal对象的make_sound方法的返回值。
阅读全文