python中的面向对象:继承、封装、多态
# 导入 ABC 是指的引入抽象父类(Abstract Base Class - 本质是抽象方法装饰器)
from abc import ABC, abstractmethodclass 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方法@propertydef name(self):if self.__name:return self.__nameelse:return 'no name'# __变量 就是私有属性@name.setterdef 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 = namedef 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)
执行结果如下