Python基础54:面向对象三大特性--多态

# **************************************************************************
# 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系统: 多态思路(一切皆文件)




上一篇:mstsc的事 随笔


下一篇:NU1LCTFer的成长之路-web入门-CTF中的sql注入-sql注入-2-wp