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)

执行结果如下

相关推荐
ai小陈1 小时前
PyTorch DataLoader数据加载性能排查:GPU利用率低的实操指南
人工智能·pytorch·python·深度学习·ai·gpu算力
2601_962299244 小时前
Azure python操作系统列表
python·操作系统·azure·虚拟机·存储配置文件
2601_962071574 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
学术 学术 Fun5 小时前
如何用 API 与 Webhook 批量把图表图片转换成 VSDX
python·自动化·api·visio
淡海水5 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
2601_962100545 小时前
python包和模块的内容整理
python·模块·导入·虚拟环境·
CS_Zero6 小时前
C语言sizeof是函数吗?
c语言·开发语言
二进制漫游记6 小时前
FastAPI项目集成 Qdrant向量数据库+阿里云Embedding完整实战(工具封装+业务调用)
数据库·python·阿里云·embedding
-今昭-7 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
2601_962381587 小时前
【转】Python渗透测试工具:sqlmap
python·渗透测试·sql注入·sqlmap·数据库安全