面向对象之多态(代码片段)

qiuxirufeng qiuxirufeng     2023-01-11     502

关键词:

多态的概念

多态指的是一类事物的多种形态,例如水有固态、液态、气态,动物有人、狗、猪,这是动物的不同形态。可能你会领悟,人狗猪不是继承于动物类吗?没错,多态在程序中的表现形式就是依赖于继承

多态性

那多态到底有什么特性呢?多态性指的是可以在不用考虑对象具体类型的前提下,直接使用对象下的方法,也就是说,继承同一个类的多个子类有相同的方法名,那么子类产生的对象就可以不用考虑具体的类型而直接调用对象的方法

举一个例子,动物有人狗猪,动物都会叫,那么人狗猪也都会叫,只不过叫的方式不同

技术分享图片
class Animal:
    pass

class People(Animal):
    def speak(self):
        print(say hello)

class Dog(Animal):
    def speak(self):
        print(汪汪汪)

class Pig(Animal):
    def speak(self):
        print(哼哼哼)

# peo、dog、pig都是动物, 只要是动物肯定有speak方法
# 于是我们可以不用考虑它们三者的具体是什么类型, 而直接使用
peo = People()
dog1 = Dog()
pig1 = Pig()

peo.speak()
dog1.speak()
pig1.speak()
View Code

但是美中不足的是,如果现在人的叫不写成 speak ,写成 talk,那么便无法遵循父类的方法去实现多态性,如果这三个都想实现叫的功能,父类要有,子类也要有,这显然很麻烦,并且这样写不能对子类有个强制性的限制,这个限制是子类必须有一个叫的功能,这个功能是 speak。于是要写一个解决方案,强制子类遵循父类的标准,有一个 abc 的模块,可以实现这个功能

技术分享图片
import abc

class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def speak(self):
        pass

class People(Animal):
    # def speak(self):
    #     print(‘say hello‘)
    
    # 写成talk便会报错
    def talk(self):
        print(say hello)

class Dog(Animal):
    def speak(self):
        print(汪汪汪)

class Pig(Animal):
    def speak(self):
        print(哼哼哼)

peo = People()
dog1 = Dog()
pig1 = Pig()

peo.speak()
dog1.speak()
pig1.speak()

# 运行
TypeError: Cant instantiate abstract class People with abstract methods speak
View Code

鸭子类型

但是上面所说的这些并不是 Python 所推崇的,Python 崇尚的是 “鸭子类型” ,即 “如果看起来像鸭子、叫声像鸭子而且走起路来也像鸭子,那么它就是鸭子”,

Python 程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象,也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的解耦合度

技术分享图片
# 利用标准库中定义的各种‘与文件类似’的对象,尽管这些对象的工作方式像文件,但他们没有继承内置文件对象的方法
# 二者都像鸭子,二者看起来都像文件,因而就可以当文件一样去用
class TxtFile:
    def read(self):
        pass

    def write(self):
        pass

class DiskFile:
    def read(self):
        pass
    def write(self):
        pass


# 例2:其实大家一直在享受着多态性带来的好处,比如Python的序列类型有多种形态:字符串,列表,元组,多态性体现如下
# str,list,tuple都是序列类型
s=str(hello)
l=list([1,2,3])
t=tuple((4,5,6))

# 我们可以在不考虑三者类型的前提下使用s,l,t
s.__len__()
l.__len__()
t.__len__()

len(s)
len(l)
len(t)
View Code

 

面向对象之多态与多态性(代码片段)

一、多态  1、定义:指的是一类事物的多种形态,如水有液体、气体和固体三种形态, 动物有人、猫、狗等存在形态。  2、示例:#!/usr/bin/envpython3#-*-coding:utf-8-*-importabcclassAnimal(metaclass=abc.ABCMeta):#同一类事物@abc.abstract... 查看详情

面向对象之多态(代码片段)

多态的概念多态指的是一类事物的多种形态,例如水有固态、液态、气态,动物有人、狗、猪,这是动物的不同形态。可能你会领悟,人狗猪不是继承于动物类吗?没错,多态在程序中的表现形式就是依赖于继承多态性那多态到... 查看详情

面向对象的三大特性之多态(代码片段)

#面向对象的三大特性之多态#多态由不同的类实例化得到的对象,调用同一个方法,执行的逻辑不同#多态的概念指出了对象如何通过他们的属性和动作来操作及访问,而不需要考虑他们具体的类#多态表明了动态(运行时)绑定... 查看详情

python面向对象之多态(代码片段)

多态第一阶段:判断一个变量是否是某个类型可以用isinstance()判断classAnimal(object):defrun(self):print("Animalisrunning")classDog(Animal):defrun(self):print("Dogisrunning")classCat(Animal):defrun(self):print 查看详情

java面向对象三大特征之继承和多态(代码片段)

...转型多态代码案例总结前言  上一篇博客我们介绍了Java面向对象思想以及三大特征之一的封装。本文将介绍面向对象三大特征的剩下两个特征——继承和多态,我个人认为继承和多态是三个特征中比较重要且理解起来稍有... 查看详情

面向对象三大特性之多态与多态性(代码片段)

一、多态‘‘‘多态:同一事物的多种形态‘‘‘#文件的多种形态:classFile:defclick(self):passclassTextFile(File):defread(self):print(‘文本文件双击可以查看内容‘)classExeFile(File):defexe(self):print(‘可执行文件双击可以执行‘)file1=TextFile()file2... 查看详情

5_面向对象-中之面向对象的特征三:多态性(代码片段)

1.多态性的理解:可以理解为一个事物的多种形态。2.何为多态性:对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)举例:Personp=newMan();Objectobj=newDate();3.多态性的使用:虚拟方法调用  >有了对象... 查看详情

面向对象三大特征之多态(代码片段)

面向对象的三大特征:封装、继承、多态。今天重点来看一下“多态”。封装  指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。将属性或方法进行封装,防止外部程序随机访问,加强代码的安全性。继承&n... 查看详情

java中面向对象三大特性之——多态(代码片段)

多态的概述: 多态是继封装、继承之后,面向对象的第三大特性。生活中,比如跑的动作,小猫、小狗和大象,跑起来是不一样的。再比如飞的动作,昆虫、鸟类和飞机,飞起来也是不一样的。可见,同一行为,通过不同的... 查看详情

第九篇:面向对象之多态与封装(代码片段)

一多态多态指的是一类事物有多种形态动物有多种形态:人,狗,猪(咳咳~人也是猴子进化来的,不允许反驳) importabcclassAnimal(metaclass=abc.ABCMeta):#同一类事物:动物@abc.abstractmethoddeftalk(self):passclassPeople(Animal):#动物的形态之一... 查看详情

java基础8---面向对象之多态抽象类接口(代码片段)

一、多态polymorphic1.多态的前提要有继承关系。要有方法重写。要有父类引用指向子类对象。2.多态中的成员访问特点1)成员变量编译看左边(父类),运行看左边(父类)。//多态:成员变量的访问publicclassPolymorphic_Demopubli... 查看详情

golang如何体现面向对象三大特征之多态?(代码片段)

...多态数组基本介绍变量(实例)具有多种形态。面向对象的三大特征,在Go语言,多态特征是通过接口实现的。可以按照统一的接口来调用不同的实现。这时接口变量就呈现不同的形态。快速入门在前面的Usb接口... 查看详情

测开之面向对象进阶篇・《多态》(代码片段)

面向对象三大特征面向对象编辑的三大特征:封装、继承、多态。封装:客观的失误封装成类(将数据和方法放在一个类中构成了封装)。继承:python中一个类可以继承于一个类,也可以继承多个类,... 查看详情

面向对象之多态多态性(代码片段)

一多态二多态性一多态多态指的是一类事物有多种形态动物有多种形态:人,狗,猪importabcclassAnimal(metaclass=abc.ABCMeta):#同一类事物:动物@abc.abstractmethoddeftalk(self):passclassPeople(Animal):#动物的形态之一:人deftalk(self):print(‘sayhello‘)clas... 查看详情

面向对象之多态,多态性,反射,以及基于反射的可拔插设计(代码片段)

多态什么多态?多态指的是一类事物有多种形态,比如动物有多种形态:人,狗,猪>>例如importabc#创建抽象类导入abcclassAnimal(metaclass=abc.ABCMeta):#同一类事物:动物@abc.abstractmethod#归一化设计deftalk(self):passclassPeople(Animal):#动物的... 查看详情

面向对象之组合封装多态性鸭子类型(代码片段)

一、组合1.什么是组合一个对象的属性是来自于另外一个类的对象,称之为组合2.为何用组合组合也是用来解决类与类代码冗余的问题3.如何用组合#classFoo:#aaa=1111#def__init__(self,x,y):#self.x=x#self.y=y##deffunc1(self):#print(‘Foo内的功能‘)###c... 查看详情

2019-05-17java学习日记之面向对象_多态&抽象类&接口(代码片段)

多态 多态的概述:A:多态(polymorphic)事物存在的多种形态B:多态前提a:要有继承关系b:要有方法重写c:要有父类引用指向子类对象多态中的成员访问特点之成员变量:成员变量:编译看左边(父类),运行看左边(父... 查看详情

面向对象三大特性之封装与多态(代码片段)

一、封装最主要的作用:隐藏对象的属性和实现细节,仅对外提供公共访问方式封装原则将不需要对外提供的内容都隐藏起来把属性都隐藏,提供公共方法对其访问在python中用双下划线开头的方式将属性隐藏起来(设置成私有的... 查看详情