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)

执行结果如下

相关推荐
A__tao12 分钟前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
研究点啥好呢16 分钟前
Github热门项目推荐 | 创建你的像素风格!
c++·python·node.js·github·开源软件
lly20240627 分钟前
C 标准库 - `<stdio.h>`
开发语言
沫璃染墨29 分钟前
C++ string 从入门到精通:构造、迭代器、容量接口全解析
c语言·开发语言·c++
jwn99929 分钟前
Laravel6.x核心特性全解析
开发语言·php·laravel
迷藏49431 分钟前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
功德+n1 小时前
Linux下安装与配置Docker完整详细步骤
linux·运维·服务器·开发语言·docker·centos
明日清晨1 小时前
python扫码登录dy
开发语言·python
我是唐青枫1 小时前
C#.NET gRPC 深入解析:Proto 定义、流式调用与服务间通信取舍
开发语言·c#·.net
JJay.1 小时前
Kotlin 高阶函数学习指南
android·开发语言·kotlin