关于python中多态的理解。

学习到多态的时候,不确定自己是否完全理解了python的多态,于是Google观看了众多资料和文献,发现很多编程大佬讲得过于抽象,不便于新手理解,这违背了python的初衷:简单。

所以我在此用通俗一点的方式作了一个总结。

先贴一段代码,在python3中举例:

(为了给非科班出身以及中学英语偏科的python学习者更友好的阅读体验,w3n特意添加了中文注释,可以不细看代码,通过注释阅读,主要目的是逻辑理解,代码次要)

class Human(object):  # 创建“人”类

def __init__(self):

print(‘I can speak‘)  # 我会讲话

class Man(Human):  # 创建“男人”类

def __init__(self):

print(‘I have to prepare money for woman in usually in China‘)  # 在中国,通常男人必须为娶妻、处对象而准备礼金和不少的钱

class Woman(Human):创建“女人”类

def __init__(self):

print(‘I do not need the money from the man if he love me. aha, you are so cute that you believe it‘)  # 如果男人爱我,我不会在意他有没有为我花钱。啊哈?你信了那只能说明你太天真了。

print(‘human:‘)

h = Human()

print(‘man:‘)

m = Man()

print(‘woman:‘)

w = Woman()  # 分别对 人类、男人类、女人类创建一个变量h、m、w

print(isinstance(h,Human))

print(isinstance(m,Man))

print(isinstance(m,Human))  # look at this, it‘s true, m is not only man but also human 分别判断h是人类吗、m是男人类吗、m是人类吗,输出结果全部为是。

#输出结果是:

#human:

#I can speak

#man:

#I have to prepare money for woman in usually in China

#woman:

#I do not need the money from the man if he love me. aha, you are so cute that you believe it

#True

#True

#True

这个例子中m(变量,类似 “x =3 ”的x)不仅是 Man(对比int)类别,也是Human(object)类别,这就是变量的多态;另外当m调用__init__方法时输出的内容和Human的__init__是不一样的,这就是多态之函数的多态。

另外为了python的学习者能够更好的学习python,opw3n特意在此告知,python的多态在国内的参考文献中还存在不同的争议,即便你不理解python的多台也没关系,并不影响你继续学习python,可以暂且跳过“python的多态”。

关于面向对象的多态理解,建议参考鸭子类型。

为了方便阅读,从维基百科引入如下内容:

鸭子类型:

参考鸭子类型,鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由"当前方法和属性的集合"决定。这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试,“鸭子测试”可以这样表述:

“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为"鸭子"的对象,并调用它的"走"和"叫"方法。在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的"走"和"叫"方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。任何拥有这样的正确的"走"和"叫"方法的对象都可被函数接受的这种行为引出了以上表述,这种决定类型的方式因此得名。

鸭子类型通常得益于"不"测试方法和函数中参数的类型,而是依赖文档、清晰的代码和测试来确保正确使用。

如有错误,请不吝赐教。

时间: 2024-11-05 14:17:14

关于python中多态的理解。的相关文章

关于Python中的列表理解及用法

在Python中,列表理解通常用于编写单行语句,这些语句通过可迭代对象进行迭代以创建新的列表或字典.本文首先介绍for循环如何在Python中工作,然后解释如何在Python中使用列表理解. Python中的for循环 Python中的for循环语句按顺序遍历任何对象.列表.字符串等的成员.与其他编程语言相比,它的语法更加简洁,不需要手工定义迭代步骤,也不需要开始迭代.尽管有几种方法可以使它的行为与其他编程语言相同(本文将不详细讨论).还可以使用continue.break.pass等语句控制f

python中的self理解

前言 先介绍下类和实例 面向对象最重要的概念就是类(class)和实例(instance),类时抽象的模板,比如学生这个抽象的事物,可以用一个student类来表示.而实例时根据类创建出来的一个个具体的"对象",每一个对象都从类中继承有相同的方法,但各自的数据可能不同(根据各自的参数来定). 1 class Student(object): 2 pass 1)定义了Student类 (object)表示该类从那个类继承下来的,object类是所有类都会继承的类 1 student=St

深入理解python(一)python语法总结:基础知识和对python中对象的理解

用python也用了两年了,趁这次疫情想好好整理下. 大概想法是先对python一些知识点进行总结,之后就是根据python内核源码来对python的实现方式进行学习,不会阅读整个源码,,,但是应该会把数据结构的实现.函数调用过程.以及python虚拟机的基本原理根据源码解释下. 当然限于笔者只是一个弱鸡,,,如内容有疏漏的地方或者是一些错误,希望看到的大佬不吝赐教. 第一部分 python语法总结 当然如果对python语法还是一无所知的同学请移步缪雪峰或者菜鸟教程等学习网站看一遍再过来,,,

python中HTMLParser简单理解

找一个网页,例如https://www.python.org/events/python-events/,用浏览器查看源码并复制,然后尝试解析一下HTML,输出Python官网发布的会议时间.名称和地点. 1 from html.parser import HTMLParser 2 from html.entities import name2codepoint 3 4 class MyHTMLParser(HTMLParser): 5 6 in_title = False 7 in_loca

对面向对象中多态的理解

原文:http://www.cnblogs.com/xrq730/p/4820237.html 概述 我们都知道面向对象有四个基本特性:抽象.封装.继承.多态.这四个特性,概括起来可以这么理解,抽象.封装.继承是多态的基础,多态是抽象.封装.继承的表现.多态,是Java中非常重要的一个部分,所以今天来谈一下多态(Polymorphism). 什么是多态 不同类的对象对同一消息作出不同的响应就叫做多态.就像上课铃响了,上体育课的学生跑到操场上站好,上语文课的学生在教室里坐好一样. 多态的作用 简单

Python中ThreadLocal的理解与使用

一.对 ThreadLocal 的理解 ThreadLocal,有的人叫它线程本地变量,也有的人叫它线程本地存储,其实意思一样. ThreadLocal 在每一个变量中都会创建一个副本,每个线程都可以访问自己内部的副本变量. 二.为什么会出现 ThreadLocal 的技术应用 我们知道多线程环境下,每一个线程均可以使用所属进程的全局变量.如果一个线程对全局变量进行了修改,将会影响到其他所有的线程对全局变量的计算操作,从而出现数据混乱,即为脏数据.为了避免逗哥线程同时对变量进行修改,引入了线程同

对于Python中RawString的理解

总结 1.'''作用: 可以表示 "多行注释" ."多行字符串" ."其内的单双引号不转义" 2.r 代表的意思是: raw 3.r 只对其内的反斜杠起作用(注意单个 \ 的问题) raw string 有什么用处呢? raw string 就是会自动将反斜杠转义. >>> print('\n') >>> print(r'\n') \n >>> (注:出现了两个空行是因为 print() 会自

Python中切片的理解

https://blog.csdn.net/u011242657/article/details/56289429 L=list(range(10))#L中的元素是0-9 L[n1:n2:n3] : n1代表开始元素下标,不写就是从头,这个要看n3的符号,n3是负的,那就是从最右边,正,从最左边. n2代表结束元素下标,不写就是到结束,同上 n3代表切片间隔以及切片方向,不写就是默认1 ,如-2 表示:切片从后往前,间隔为2 L中每个元素都有正负两种下标,正数从L[0]开始,表示第一个元素.倒数

对Java面向对象中多态的理解

理解的要点:多态意味着父亲的变量可以指向子类对象 面向对象程序设计的三大支柱是封装.继承和多态 封装对外把相应的属性和方法实现的细节进行了隐藏.继承关系使一个子类继承父亲的特征,并且加上了一些新的特征.子类是它的父亲的特殊化, 每一个子类的实例都是其父亲的实例,但是反过来就不成立.例如:每个圆都是一个几何对象,但并非每一个几何对象都是圆.因此,总可以将子类 的实例传给需要父亲型的参数.考虑如下的代码. class Person{ String name = "John"; public