当前位置:首页>python>AI学习之python-面向对象痛点之封装、继承、多态、抽象

AI学习之python-面向对象痛点之封装、继承、多态、抽象

  • 2026-10-11 06:46:12
AI学习之python-面向对象痛点之封装、继承、多态、抽象
四      面向对象编程中,一大痛点就是怎么理解面向对象的三大特性,封装、继承、多态、抽象。其实这一块也是我学习过程中的痛点,开始时候不理解这几个概念的意思,后面又不知道怎么用,不知道代码写的对不对,写出来的代码运行过程中,出现问题不知道改哪里。所以这一块内容花费了我很多时间,反复尝试反复默写,才理解了一个大概,还不敢说熟练掌握,希望能和大家一起探讨。
      很多初学者卡在面向对象编程这个概念上,一直不理解什么事面向对象。我学习的时候也是一知半解,后面查阅各种资料,并且自己上手写代码,慢慢才理解这些概念。所以大家刚学时候一脸懵不要着急,多看多写会理解的。
      按我现在的理解就是,类就是一个标准的箱子,箱子里放了苹果、香蕉等水果,对应了类中的数据,还配了刀具,用来给水果削皮,切片,对应了类中的函数方法。
      这个装好水果和刀具的箱子,就是对象。
      将水果和刀具打包装起来就是封装;
      这个通用水果箱就是父类,再做个专门装苹果的箱子就是子类,子类有父类所有功能,并且可以写自己的功能;
      抽象就是吃这里的水果都要去皮,子类需要重写父类抽象方法,比如苹果用水果刀去皮,香蕉直接剥皮;
      多态就是比如削皮,苹果需要用水果刀,香蕉直接用手剥皮,不同的水果用不同处理方式,就是多态。
      下面用一个例子来说明面向对象的上述四种特性。
      首先定义一个,用编程教学中最喜欢的animal类,接后面功能在这定义一个食物类
# 定义食物类

class Food(object):

    def __init__(self, name):

        self.name = name

# 再定义一个骨头类继承食物类

class Bone(Food):

    def __init__(self, name):

        super().__init__(name)

# animal父类

class Animal(ABC):          

# 构造方法

    def __init__(self, name):     

        self.name = name

# getter方法

    @property

    def name(self):                  

        if self.__name:

            return self.__name

        else:

            return 'null'

    # setter方法

    @name.setter

    def name(self, name):

        if isinstance(name, str):

            self.__name = name.title()

        else:

            self.__name = None

# 抽象方法,吃东西

    @abstractmethod   

    def eat(self, food: Food): ...

上面定义了一个父类animal,里面有一个抽象方法eat,再定义一个Dog子类

class Dog(Animal):

    def __init__(self, name):

        super().__init__(name)

    # 重写父类eat方法,需要在上面增加一个food类

    def eat(self, food):

        print(f'{self.name}正在吃{food.name}')

    # 子类特有方法

    def sleep(self):

        print(f'{self.name}正在睡觉')

其他动物类和食物类就不在这例子中定义了,留个大家作为多态的内容思考,怎么补充例子

# 再定义一个人物类

class Person(object):

    def __init__(self, name):

        self.name = name

    # 人可喂养动物

    def feed(self, animal: Animal, food: Food):

        print(f'{self.name}正在喂{animal.name}吃{food.name}')

        # 动物吃食物方法

        animal.eat(food)

        print(f'{animal.name}吃饱了,准备奖励{self.name},表演节目')

        # 狗类特有方法

animal.sleep()

# 创建对象

p = Person('小明')

dog = Dog('小黄')

bone = Bone('骨头')

# 执行方法

p.feed(dog , bone)

# 运行结果

      大家可以看看你们的运行正确了吗,特别要注意,易错点Animal中的getter方法里面,name前面要有__双下划线,表示私有属性name,否则会陷入无限循环调这个name方法

 @property

    def name(self):

        if self.__name:

            return self.__name

        else:

            return 'null'

      上述例子把面向对象的封装、继承、抽象都举例,大家可以通过代码是这理解这几大特性的含义,并且思考使用方式。

      封装就是把变量和方法都封装到类里,外部不允许修改,也看不到里面的具体实现方式,只能调用;

     继承就是子类可以继承父类所有的属性和方法,父类的这些属性和方法在子类中都可以直接使用;

     多态就是多定义几个动物类、食物类,除了Dog和Bone类之外,再定义几个这样的类,p对象的feed方法传入不同的动物和食物参数,可以得到不同的结果,感兴趣的话大家可以试着自己补上多态例子。

      抽象就是父类定义抽象方法,继承父类的子类必须要实现父类中的抽象方法,比如上面的eat类。

      面向对象四大特性是非常重要的基础概念,是理解面向对象编程,并且自由扩展程序必须掌握的。大家可以在此例子的基础上,补充多态的例子,自由扩展,熟能生巧,相信大家都能熟练掌握。大家知道除了python外,还有哪些语言有面向对象的这些特性呢?

最新文章

随机文章