# **************************************************************************
# Python学习
# **************************************************************************
# ** 所属主题: 类
# ** 所属分层: 06 面向对象三大特性--多态.py
# ** 功能描述: 06 面向对象三大特性--多态.py
# ** 创 建 者: 陈红伟
# ** 创建日期: 2021/6/20 10:38 下午
# **************************************************************************
# ** 修改日期 修改人 修改内容
# ** 2021/6/20 陈红伟 新增学习内容代码
# **************************************************************************
"""
多态:
1、什么叫多态: 同一个事物多种形态
"""
class Anmial:
pass
class People(Anmial):
pass
class Dog(Anmial):
pass
class Pig(Anmial):
pass
"""
2、为何要有多态,多态会带来什么特性: 多态性
"""
class Anmial:
def say(self):
print("动物基本的发声频率...")
pass
class People(Anmial):
def say(self):
super().say()
print('人 嘤嘤嘤')
pass
class Dog(Anmial):
def say(self):
super(Dog, self).say()
print("狗 汪汪汪")
pass
class Pig(Anmial):
def say(self):
# super(Dog, self).say()
print("猪 哼哼哼")
pass
pig = Pig()
pig.say() # 猪 哼哼哼
# [体现多态]的好处:
# 定义一个统一的接口,接收传入的动物的对象
def animal_say(animal):
animal.say()
animal_say(Pig()) # 猪 哼哼哼
animal_say(People())
# 动物基本的发声频率...
# 人 嘤嘤嘤
animal_say(Anmial())
# 动物基本的发声频率...
animal_say(Dog())
# 动物基本的发声频率...
# 狗 汪汪汪
# 多态应用:
def my_len(obj):
return obj.__len__()
print(my_len("hello")) # 5
print(my_len({'a':1,'b':2})) # 2
print(my_len([1,2,3])) # 3
# 但是这样有个问题,没有强制限制继承的子类中要求实现say方法,就算不实现,会去父类中找,也不会报错,那怎么才能强制实现呢?
# 类似于java的接口一样呢?
# 答案就是 abc ,引入一个抽象基类的方法
import abc # 类似于java中接口的概念
class Animal(metaclass=abc.ABCMeta): # 统一所有子类的标准,不能被实例化了
@abc.abstractmethod # 抽象方法,继承类该类就必须实现该方法
def eat(self):
pass
class Fish(Animal):
pass
class Cat(Animal):
def eat(self):
print("cat: eatting...")
cat = Cat()
cat.eat() # cat: eatting...
# Fish().eat() # TypeError: Can't instantiate abstract class Fish with abstract methods eat 因为没有实现父类中的该方法不能用
# 注意⚠️:
# a = Animal()
# TypeError: Can't instantiate abstract class Animal with abstract methods eat
# 用来统一标准(加上了(metaclass=abc.ABCMeta))的类不能被实例化了
# 鸭子类型:类之间可以没有继承关系,但是每个类都有一个相同的方法名(例如say())
# linux系统: 多态思路(一切皆文件)