# 导入 ABC 是指的引入抽象父类(Abstract Base Class - 本质是抽象方法装饰器)
from abc import ABC, abstractmethod
class Food(object):
# 构造方法
def __init__(self, name):
self.name = name
# Food子类
class Bone(Food):
def __init__(self):
super().__init__('Bone')
class Fish(Food):
def __init__(self):
super().__init__('Fish')
class Worm(Food):
def __init__(self):
super().__init__('Worm')
# Animal类,继承ABC就有了抽象方法的定义权
class Animal(ABC):
def __init__(self, name):
self.name = name
# getter方法
@property
def name(self):
if self.__name:
return self.__name
else:
return 'no name'
# __变量 就是私有属性
@name.setter
def name(self, name):
# 逻辑判断
if isinstance(name, str):
self.__name = name.title()
# 否则返回空对象
else:
self.__name = None
# 吃饭 - 父类中的eat是抽象行为
@abstractmethod
# 定义一个抽象方法,让子类去进行自行实现
def eat(self, food: Food):...
# 子类
class Cat(Animal):
# 使用父类构造方法
def __init__(self, name):
super(Cat, self).__init__(name)
# 重写抽象方法
def eat(self, food: Food):
print(f'{self.name} eats {food.name}')
def walk(self):
print(f'{self.name} walks quickly')
class Dog(Animal):
def __init__(self, name):
super(Dog, self).__init__(name)
def eat(self, food: Food):
print(f'{self.name} eats {food.name}')
def chase_tail(self):
print(f'{self.name} chases tail')
class Person(object):
def __init__(self, name):
self.name = name
def feed(self, anmial: Animal,food: Food):
print(f'{self.name} feeds {anmial.name}')
anmial.eat(food)
print(f'{anmial.name}吃饱了,准备给 {self.name}, 表演一个')
if isinstance(anmial, Dog):
anmial.chase_tail()
elif isinstance(anmial, Cat):
anmial.walk()
p1 = Person('John')
cat = Cat('jery')
dog = Dog('tom')
bone = Bone()
fish = Fish()
p1.feed(dog, bone)
p1.feed(cat, fish)
执行结果如下