ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-06-20 23:30:09  阅读:195  来源: 互联网

标签:Anmial Python 54 多态 say pass print class


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




标签:Anmial,Python,54,多态,say,pass,print,class
来源: https://blog.csdn.net/xiaowei0548/article/details/118077062

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有