from abc import ABCMeta, abstractmethod class Pet(object, metaclass=ABCMeta): """宠物""" def __init__(self, nickname): self._nickname = nickname @abstractmethod def make_voice(self): """发出声音""" pass class Dog(Pet): """狗""" def make_voice(self): print('%s: 汪汪汪...' % self._nickname) class Cat(Pet): """猫""" def make_voice(self): print('%s: 喵...喵...' % self._nickname) def main(): pets = [Dog('旺财'), Cat('凯蒂'), Dog('大黄')] for pet in pets: pet.make_voice() if __name__ == '__main__': main()解释每段代码
时间: 2024-04-22 10:26:10 浏览: 153
这段代码定义了一个宠物类和两个具体的宠物类(狗和猫),并展示了它们的特定行为。以下是对每段代码的解释:
```python
from abc import ABCMeta, abstractmethod
```
这行代码导入了ABC(Abstract Base Class)元类和abstractmethod装饰器,用于创建抽象类和抽象方法。
```python
class Pet(object, metaclass=ABCMeta):
"""宠物"""
```
这段代码定义了一个宠物类,它是一个抽象基类。宠物类具有一个构造函数,接受一个昵称作为参数。
```python
def __init__(self, nickname):
self._nickname = nickname
```
这个构造函数将昵称参数保存在宠物对象的私有属性_nickname中。
```python
@abstractmethod
def make_voice(self):
"""发出声音"""
pass
```
这个抽象方法定义了一个发出声音的行为,子类必须实现这个方法。
```python
class Dog(Pet):
"""狗"""
```
这段代码定义了一个狗类,它是宠物类的子类。
```python
def make_voice(self):
print('%s: 汪汪汪...' % self._nickname)
```
这个方法实现了狗类的发出声音行为,输出狗的昵称和“汪汪汪...”。
```python
class Cat(Pet):
"""猫"""
```
这段代码定义了一个猫类,它也是宠物类的子类。
```python
def make_voice(self):
print('%s: 喵...喵...' % self._nickname)
```
这个方法实现了猫类的发出声音行为,输出猫的昵称和“喵...喵...”。
```python
def main():
pets = [Dog('旺财'), Cat('凯蒂'), Dog('大黄')]
for pet in pets:
pet.make_voice()
```
这个main函数创建了几个宠物对象(狗和猫),并遍历它们调用make_voice方法发出声音。
```python
if __name__ == '__main__':
main()
```
这段代码判断当前模块是否为主模块,如果是,则执行main函数。这样,在直接运行这个模块时,会执行main函数,而在被导入时不会执行。
阅读全文