一、多态

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

  

最新文章

  1. python利用dict模拟switch
  2. 2-2 Linux 根文件系统详解
  3. C# 多线程详解 Part.04(Lock、Monitor、生产与消费)
  4. Redis与Memcached的区别
  5. 我的JavaScript笔记
  6. iOS蓝牙4.0
  7. sql 、linq、lambda 查询语句的区别
  8. Java中的编码格式
  9. jQuery slideDown()--向下滑动
  10. hadoop2.7.3+spark2.1.0+scala2.12.1环境搭建(4)SPARK 安装
  11. 如果以一个树状的形式返回一个UIView的所有子视图
  12. [外包]!采用asp.net core 快速构建小型创业公司后台管理系统(六.结语)
  13. iptables-save命令
  14. char *s="string"和char s[]="string"的区别
  15. web前端实现本地存储
  16. VB的一些项目中常用的通用方法-一般用于验证类
  17. OAF中下载附件之后页面失效,报过时的数据异常,浏览器后退异常
  18. NOSQL之MEMCACHE
  19. cmake-add_definitions
  20. filebeat 插件开发

热门文章

  1. &lt;深度学习优化策略-3&gt; 深度学习网络加速器Weight Normalization_WN
  2. React Hooks介绍和环境搭建(一)
  3. [java.lang.NoSuchMethodError: org.hibernate.Session.createQuery(Ljava/lang/String;)Lorg/hibernate/query/Query;]
  4. 新零售下的 AI智能货柜
  5. 【原创】aws s3 lambda缩略图生成
  6. iptables保存规则(ubuntu和centos)
  7. Composer 安装 Jira API 库
  8. Docs-.NET-C#-指南-语言参考-关键字-值类型:可以 null 的值类型
  9. Flutter响应式编程 - Stream
  10. python-learning-第二季-数据库编程