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)

执行结果如下

相关推荐
默_笙3 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003963 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技3 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
只睡四小时3 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
奇思妙想聪明勤奋的小羊3 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
lpfasd1233 天前
2026年第38周GitHub趋势周报
python·科技·github