python中的面向对象:继承、封装、多态

python 复制代码
# 导入 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)

执行结果如下

相关推荐
旷世奇才李先生11 分钟前
Next.js 安装使用教程
开发语言·javascript·ecmascript
凛铄linshuo32 分钟前
爬虫简单实操2——以贴吧为例爬取“某吧”前10页的网页代码
爬虫·python·学习
牛客企业服务34 分钟前
2025年AI面试推荐榜单,数字化招聘转型优选
人工智能·python·算法·面试·职场和发展·金融·求职招聘
charlie1145141911 小时前
深入理解Qt的SetWindowsFlags函数
开发语言·c++·qt·原理分析
胡斌附体1 小时前
linux测试端口是否可被外部访问
linux·运维·服务器·python·测试·端口测试·临时服务器
likeGhee1 小时前
python缓存装饰器实现方案
开发语言·python·缓存
whoarethenext2 小时前
使用 C++/Faiss 加速海量 MFCC 特征的相似性搜索
开发语言·c++·faiss
项目題供诗2 小时前
黑马python(二十五)
开发语言·python
读书点滴2 小时前
笨方法学python -练习14
java·前端·python
慌糖2 小时前
RabbitMQ:消息队列的轻量级王者
开发语言·javascript·ecmascript