Python——多态、检查类型

一、多态

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

  

原文地址:https://www.cnblogs.com/mingmingming/p/11221352.html

时间: 2024-07-30 14:55:45

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

多态 这是动态语言和静态语言(例如Java)最大的差别之一。动态语言调用实例方法,不检查类型,只要方法存在,参数正确,就可以调用。

多态 类具有继承关系,并且子类类型可以向上转型看做父类类型,如果我们从 Person 派生出 Student和Teacher ,并都写了一个 whoAmI() 方法: class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender def whoAmI(self): return 'I am a Person, my name is %s' % self.name clas

python多态和鸭子类型

多态 多态是同一个行为对于不同的对象具有多个不同表现形式或形态的能力. 多态性是对象多种表现形式的体现. 比如 我们按下 F1 键这个动作: 如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档: 如果当前在 Word 下弹出的就是 Word 帮助: 在 Windows 下弹出的就是 Windows 帮助和支持. 同一个事件发生在不同的对象上会产生不同的结果. 文件有多种形态:文本文件,可执行文件 import abc # 抽象类 class File(metaclass=abc.AB

Python的数值类型

问题: 1. Python数值有哪些? 2. 各类型的精度是多少? 3. 类型的转换是如何实现的? 5. 如何使用这些数据类型?需要注意什么? 6. 什么是不可变类型? 数值类型:     整型: (不可变类型)         标准整型:取值范围[-sys.maxint-1, sys.maxint]         长整型:可表示无限大的整数,其值仅与你机器支持的(虚拟)内存大小有关         数值超出标准整型范围将会转换为长整型.         例如:             1.定

十分钟学会Python的基本类型

一:起因 (1)说起学习Python的原因,上一篇blog已经提到过了:Python掐指一算不过是自己接触过的第四门大型语言(从接触到现在已经2周了)c/c++ ,Java,MATLAB(PS:应该还不算入门,只会简单的应用),之后就是python了. (2)c/c++ 到java的过渡是非常短暂的,但是过渡到MATLA就非常的不顺利(PS:就是上一篇的blog提到过的,从内心里抵触一门未曾谋面的语言),当时就已经感受到了开启一门新语言阻力非常大(有时可以用可遇不可求来形容). (3)从java

Python 多态

类的多态 多态 多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作.简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针. 那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化:继承可以扩展已存在的代码模块(类):它们的目的都是为了--代码重用.而多态则是为了实现另一个目的--接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用"家谱"中

Python的动态类型

动态类型:                                                      在python中,类型是在运行过程中自动决定的,而不是通过代码声明的. 变量:                                                                                     变量是一个系统表的元素,拥有指向对象的连接的空间 python中,类型的概念是存在于对象中的,而不是变量中,变量是通用的. 变量的使用

Python中布尔类型

我们已经了解了Python支持布尔类型的数据,布尔类型只有True和False两种值,但是布尔类型有以下几种运算: 与运算:只有两个布尔值都为 True 时,计算结果才为 True. True and True   # ==> TrueTrue and False   # ==> FalseFalse and True   # ==> FalseFalse and False   # ==> False或运算:只要有一个布尔值为 True,计算结果就是 True. True or

python中非序列类型期望值拷贝的解决方案

看下面这段代码: # -*- coding: utf-8 -*-import copy class Present(object):    def __init__(self, str_cmd):        self._str_cmd = str_cmd        print "进入Present时的地址:", id(self._str_cmd) def set_value(self):        temp = "test_cmd"        sel

python 内置数据类型

一.Dictionary 的介绍 dictionary 是python 的内置类型之一,它定义键和值之间一对一的关系 1.定义dictionary 2.修改dictionary NOTE: Dictionary 是无序的.当使用 dictionary 时,您需要知道:dictionary 的 key 是大小写敏感的. 3.dictionary 中混用数据类型 4.dictionary 删除元素 二.List 介绍 List 是 Python 中使用最频繁的数据类型.它很像java中的ArrayL