类的多态与多态性(代码片段)

nickchen121 nickchen121     2022-12-17     574

关键词:

什么是多态

  • 多态指的是同一种事物的多种形态

    • 水--》冰、水蒸气、液态水

    • 动物--》人、狗、猪

技术图片

为什么用多态

  • 多态性:

    • 继承同一个类的多个子类中有相同的方法名

    • 那么子类产生的对象就可以不用考虑具体的类型而直接调用功能

多态的应用

  • Animal()--》强调:父类是用来指定标准的,不能被实例化,也就是说父类中被@abc.abstractmethod装饰的方法,子类必须也要有,如果没有的话则会报错,这个拥有被装饰的方法的类称为抽象类

  • 由于动物都有叫,如果人的叫使用speak();狗的叫使用talk();猪的叫用jiao(),也就是说对于不同的动物有不同的叫方法,那么对于使用者来说,使用起来非常麻烦。因此我们可以规定人、狗、猪的叫都是speak(),那么我们以后使用某个动物叫的方法,只需要调用speak即可

技术图片

import abc


class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def speak(self):
        print('11111')

    @abc.abstractmethod
    def eat(self):
        pass


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

    def eat(self):
        pass


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

    def eat(self):
        pass


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

    def eat(self):
        pass


peo1 = People()
dog1 = Dog()
pig1 = Pig()
peo1.speak()
say hello
dog1.speak()
汪汪汪
pig1.speak()
哼哼哼
def my_speak(animal):
    animal.speak()


my_speak(peo1)
say hello
my_speak(dog1)
汪汪汪
my_speak(pig1)
哼哼哼

数据类型中多态的应用

  • 其实我们一直在使用多态,列表、元组、字符串的len()方法其实就是一种多态的应用,我们不需要关心len()的数据类型,我们只需要记住如果需要求一个容器类型的长度,使用len()的方法就行
l = [1, 2, 3]
s = 'helllo'
t = (1, 2, 3)

print(l.__len__())
print(s.__len__())
print(t.__len__())

# 列表、字符串、元组规定了计算这些数据类型的长度就必须使用len()方法
# def len(obj):
#     return obj.__len__()
3
6
3
print(len(l))  # l.__len__()
print(len(s))  # s.__size__()
print(len(t))  # t.__width__()
3
6
3

鸭子类型

  • python推崇的是鸭子类型,只要你叫的声音像鸭子,并且你走路的样子也像鸭子,那你就是鸭子

技术图片

  • Linux中一切皆文件,只要我们规定硬盘、进程、文件都是文件,都拥有读read()写write()方法,那我们就没必要定义一个抽象文件类,更没必要使用@abc.abstractmethod装饰器规定文件需要拥有这些方法,因为这不符合Python的风格
class Disk:
    """硬盘"""
    def read(self):
        print('disk read')

    def write(self):
        print('disk wirte')


class Process:
    """进程"""
    def read(self):
        print('process read')

    def write(self):
        print('process wirte')


class File:
    """文件"""
    def read(self):
        print('file read')

    def write(self):
        print('file wirte')


obj1 = Disk()
obj2 = Process()
obj3 = File()

obj1.read()
obj1.write()
disk read
disk wirte

技术图片

继承与多态(代码片段)

 最近学习廖大的教程,看到类的继承与多态,看了一下做一下总结。 自雷继承父类的时候,可以继承父类里定义的函数(类里定义函数的时候一定要将第一个参数定义self,class后面紧接着是类名,即Student,类名通常是... 查看详情

python继承与多态!(代码片段)

继承继承让我们更加容易实现类的扩展。子类是父类的拓展。classParentClass1:#定义父类1passclassParentClass2:#定义父类2passclassSubClass1(ParentClass1):#单继承,基类是ParentClass1,派生类是SubClasspassclassSubClass2(ParentClass1,ParentClass2):#python支持 查看详情

面向对象进阶1(代码片段)

...继承问题类的分类新式类经典类菱形继承问题类的多态与多态性多态多态性多态性的好处类的继承什么是继承继承就是新建一个类的方式,新建的类我们叫子类,被继承的类称为父类在现实生活中,子女继承了父母的基因,遗产... 查看详情

多态性(代码片段)

...                 2018-04-30  22:34:59多态性1.多态性指的是什么?  多态性,可以理解为一个事物的多种表现形态。  1.1方法的重载与重写  1.2子类对像的多态性2.子类对像的多态性使用的前提  2.1... 查看详情

java多态性(代码片段)

多态性是指一个接口可以对应多种不同的实现方法。体现在编译多态性和运行多态性。编译多态性是指在编译过程中体现出的多态性。如方法重载,即方法名相同,参数类型、个数、顺序不同。运行多态性是指由类的继承和方法... 查看详情

继承与多态(代码片段)

...态。1.包的定义与使用(1)Java中通过包来完成对类的管理,每个类都该存放在相应的包里。(2)Java中的包其实就是文件夹的概念,用来 查看详情

重载与多态(代码片段)

...作用于不同的数据类型时有不同的行为。重载形式重载为类的非静态成员函数,重载为非成员函数。两种重载方式的声明语法形式一般相同都为返回类型operator运算符(形参表)函数体非成员函数一般定义为友元函数。**实现‘+... 查看详情

java多态与抽象类(代码片段)

...绑定1.4向下转型1.5理解多态二、抽象类2.1语法规则2.2抽象类的作用上一节我们学习了包,以及面向对象的基本特征之一:继承【Java】包和继承在此基础上,这一节,将介绍面向对象的其他的两个基本特征:多... 查看详情

c++多态的基本概念(代码片段)

...满足条件:1、有继承关系(父子关系)2、子类要重写父类的虚函数(对应的speak函数),与重载不同3、函数返回值的类型,函数名称参数列表完全相同动态、多态的使用1、父类的指针或者引用,执行子类对象#include<iostream>... 查看详情

c++多态(代码片段)

...件与虚函数多态很重要的前提就是先继承。并且要去用基类的指针或者是引用去调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。#include<iostream>usingnamespacestd;classPersonpublic: virtualvoidBuyTicket(... 查看详情

继承与多态——动手又动脑(代码片段)

1.首先,第一次执行完源代码后了解到当调用一个子类的构造方法时,它会依次调用父类的构造函数。以下是原因:当一个类继承了其它类时,在它的构造函数(constructor)中super()必须被首先调用,如果super()没有被调用,则编译器... 查看详情

多态与重载(代码片段)

...息被不同类型的对象接收时导致的不同行为。消息是指对类的成员函数的调用。不同行为是指不同的实现,即调用了不同的函数。2:多态的类型:1:专用多态:?1:重载多态?2:强制多态2:通用多态:?3:包含多态?4:参数多态3... 查看详情

继承与多态动手动脑(代码片段)

1.为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?构造函数是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建... 查看详情

抽象类与多态(代码片段)

抽象类es中并没有引用抽象类的概念,这是ts对es又一次扩展,所谓抽象类就是只能被继承而不能被实例化的类。举例说明://定义抽象类AnimalabstractclassAnimal//定义方法,子类可以复用eat()console.log(‘eat‘)//也可以不指定方法的具... 查看详情

理解多态的语法使用以及多态的实现原理(代码片段)

...)2.5虚函数重写的两个例外2.5.1协变(基类与派生类的虚函数返回值类型不同。)2.5.2派生类的虚函数可以不加virtual2.5.2.1例题2.5.3析构函数的重写(基类与派生类析构函数的名字不同,编译后内部是相同的)2.6C+... 查看详情

c++中的多态(代码片段)

...,产生了不同的行为。多态构成的条件1、必须通过基类的指针或者引用调用虚函数。注意:对象不行。2、被调用的函数必须是虚函数,且派生类的虚函数必须对基类的虚函数进行重写,注意:基类的的虚函数... 查看详情

面向对象(代码片段)

...用3属性查找与绑定方法4继承与派生5组合6抽象类7多态和多态性8封装9绑定方法与非绑定方法10其它内置函数 8.1类的定义和使用#类体代码在类的定义阶段就会立刻执行classStudent:school=‘oldboy‘#数据属性deflearn(self):#函数属性prin... 查看详情

类的继承定义一个computer类在此基础上派生出两个子类(继承与多态绑定)(代码片段)

题目如下定义一个计算机类(Computer),并在它的基础上派生出两个子类:台上机(Desktop)和便携机类(Notebook),在Computer中定义几个方法,并在子类Desktop和Notebook中覆盖这些方法。在main方法中利用对象类型转换将类Desktop和Notebook的对... 查看详情