# 導入 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)
執行結果如下