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)

执行结果如下

相关推荐
2501_936146043 分钟前
烟草叶片病害检测_YOLO11-C3k2-MSBlock模型详解
python
DICOM医学影像4 分钟前
2. go语言从零实现以太坊客户端-查询区块链账户余额
开发语言·golang·区块链·以太坊·web3.0·hardhat
Data_agent15 分钟前
Python 编程实战:函数与模块化编程及内置模块探索
开发语言·python
new_zhou15 分钟前
vs2019+qt工程中生成dump文件及调试
开发语言·qt·visual studio·dump调试
十铭忘18 分钟前
windows系统python开源项目环境配置1
人工智能·python
Generalzy34 分钟前
langchain deepagent框架
人工智能·python·langchain
栈与堆40 分钟前
LeetCode 19 - 删除链表的倒数第N个节点
java·开发语言·数据结构·python·算法·leetcode·链表
一路向北·重庆分伦42 分钟前
03-01:MQ常见问题梳理
java·开发语言
txinyu的博客1 小时前
结合游戏场景理解,互斥锁,读写锁,自旋锁,CAS / 原子变量,分段锁
开发语言·c++·游戏
阿里嘎多学长1 小时前
2026-01-11 GitHub 热点项目精选
开发语言·程序员·github·代码托管