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