一、多态

Python变量并不需要声明类型,同一个变量可以在不同的时间引用不同的对象,当一个变量在调用同一个方法,可以呈现出多种行为,而具体呈现出哪种行为由该变量引用的对象来决定,这就是多态。

先看一下以下例子:

class Dog:
def behavior(self,skill):
print ('小狗会%s!'%skill) class Cat:
def behavior(self,skill):
print ('小猫会%s!'%skill) class Host:
def pet(self,met,*arg):
print ('小明的宠物有特殊技能,',end = '')
met.behavior(self,*arg) H = Host()
H.pet(Dog,'唱') # 打印 小明的宠物有特殊技能,小狗会唱!
H.pet(Cat,'跳') # 打印 小明的宠物有特殊技能,小猫会跳!

上面的例子中,当涉及Host类的pet()方法时,该方法传入的参数对象只需要具有behavior()方法就可以了,怎样的行为特征完全取决于对象本身。

二、检查类型

Python提供了两个函数来检查类型,issubclass()和isinstance()。

先查看一下issubclass()函数的用法,

>>> help(issubclass)
Help on built-in function issubclass in module builtins: issubclass(cls, class_or_tuple, /)
Return whether 'cls' is a derived from another class or is the same class. A tuple, as in ``issubclass(x, (A, B, ...))``, may be given as the target to
check against. This is equivalent to ``issubclass(x, A) or issubclass(x, B)
or ...`` etc.

可以看到,该函数用于判断cls参数是否是class_or_tuple参数的子类或者是同一个类。

例:

class Dog:
def behavior(self):
print ('小狗会唱!') class Cat:
def skill(self):
print ('小猫会跳!') class Host(Dog):
def pet(self):
print ('小明有一只宠物!') print (issubclass(Cat,Cat)) # 同一个类,打印 True
print (issubclass(Dog,Host)) # Dog类是Host类的父类,所以打印 False
print (issubclass(Dog,Cat)) # Dog类不是Cat类的子类,所以打印 False
print (issubclass(Host,Dog)) # Host类是Dog类的子类,所以打印 True

  

再看一下isinstance()函数的用法,

>>> help(isinstance)
Help on built-in function isinstance in module builtins: isinstance(obj, class_or_tuple, /)
Return whether an object is an instance of a class or of a subclass thereof. A tuple, as in ``isinstance(x, (A, B, ...))``, may be given as the target to
check against. This is equivalent to ``isinstance(x, A) or isinstance(x, B)
or ...`` etc.

isinstance()函数用于判断一个对象是否是一个已知的类型,obj参数类型和class_or_tuple参数类型相同,则返回Ture,否则False。

例:

a = '1111'
print (type(a)) # <class 'str'>
print (isinstance(a,str)) # 参数a类型不是str,返回 True
print (isinstance(a,int)) # 参数a类型不是int,返回 False

  

Python——多态、检查类型的更多相关文章

  1. python 全栈开发,Day21(抽象类,接口类,多态,鸭子类型)

    一.昨日复习 派生方法和派生属性 super 只有在子父类拥有同名方法的时候, 想使用子类的对象调用父类的方法时,才使用super super在类内 : super().方法名(arg1,..) 指名 ...

  2. python多态和鸭子类型

    多态与多态性 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承). 比如:文件分为文本文件,可执行文件(在定义角度) 比如 我们按下 F1 键这个动作: 如果当前在 Fl ...

  3. python 多态

    多态 类具有继承关系,并且子类类型可以向上转型看做父类类型,如果我们从 Person 派生出 Student和Teacher ,并都写了一个 whoAmI() 方法: class Person(obj ...

  4. C++值多态:传统多态与类型擦除之间

    引言 我有一个显示屏模块: 模块上有一个128*64的单色显示屏,一个单片机(B)控制它显示的内容.单片机的I²C总线通过四边上的排针排母连接到其他单片机(A)上,A给B发送指令,B绘图. B可以向屏 ...

  5. python none,null,,,,,类型

    内建类型None表示一个空对象,没有方法和属性. None是一个特殊的常量. None和False不同. None不是0. None不是空字符串. None和任何其他的数据类型比较永远返回False. ...

  6. 多态 鸭子类型 反射 内置方法(__str__,__del__) 异常处理

    ''' 1什么是多态 多态指的是同一种/类事物的不同形态 2 为何要有多态 多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象 多态性的精髓:统一 多态性的好处: 1增加了程序的 ...

  7. day 28 面向对象 三种特性之一 多态 鸭子类型 反射(反省)

    多态是OOP的三大特征之一 字面意思:多种形态 多种状态 官方描述:不同的对象可以响应(调用)同一个方法 产生不同的结果(例如水的三相特征) 多态不是什么新技术 我们编写面向对象的程序时 其实就有多态 ...

  8. 9 python 多态与多态类

    1.多态定义 多态指的是一类事物的多种形态 比如动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCMeta): @abc.abstractm ...

  9. python基础——重访类型分类

    python基础--重访类型分类 对象根据分类来共享操作:例如,字符串.列表和元组都共享诸如合并.长度和索引等序列操作. 只有可变对象(列表.字典和集合)可以原处修改:我们不能原处修改数字,字符串.元 ...

随机推荐

  1. Leet Code 1.两数之和

    给定一个整数nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标. 可以假设每种输入只会对应一个答案.但是,不能重复利用这个数组中同样的元素. 题解 提交代 ...

  2. 胶囊网络 -- Capsule Networks

    胶囊网络是 vector in vector out的结构,最后对每个不同的类别,输出不一个向量,向量的模长表示属于该类别的概率. 例如,在数字识别中,两个数字虽然重叠在一起,Capsule中的两个向 ...

  3. iTop汉化

  4. Win10下轻松安装centos7.0(推荐)

    Windows10下安装centos7.0虚拟机环境 Windows10自带了一个类似Vmware虚拟化产品Hyper-V管理器 如果没有找到这个的小伙伴可以从菜单中的windows管理工具找到如图: ...

  5. linux下如何制作initrd镜像?

    1. 准备文件 加入已经准备好了所有文件在/home/initrd-base目录下 2. 制作initrd镜像 cd /home/initrd-base/ ;find . | cpio --quiet ...

  6. PostgreSQL 登录时在命令行中输入密码

    有时候需要设置定时任务直接执行 sql 语句,但是 postgresql 默认需要人工输入密码,以下命令可以直接在命令行中直接填入密码 PGPASSWORD=pass1234 psql -U MyUs ...

  7. IFC构件位置数据与revit模型中对应构件位置数据对比

    IFC构件位置数据与revit模型中对应构件位置数据对比

  8. SeetaFaceEngine2 实例

    LOG: Creating layer(6):LOG: Creating layer(0):LOG: Creating layer(9):LOG: Creating layer(0):LOG: Cre ...

  9. 软件定义网络基础---SDN的核心思想

    一:SDN包含的核心思想:解耦,抽象,可编程 二:解耦 (一)SDN网络解耦思想 解耦是指将控制平面和数据平面进行分离,主要为了解决传统网络中控制平面和数据平面在物理上紧耦合导致的问题 控制平面和数据 ...

  10. 为何windows自带的文件搜索这么慢,而Everything的这么快

    为何windows自带的文件搜索这么慢,而Everything的这么快 摘自:http://blog.sina.com.cn/s/blog_9f0cf4ed0102wvkq.html (2016-07 ...