issubclass()与isinstance()

内置函数issubclass()用于判断类对象与类对象之间的关系
内置函数isinstance()用于判断实例对象与类对象之间的关系
内置函数issubclass()接受两个实参,
第一个实参是类对象,
第二个实参是类对象或由类对象组成的元组。
当第二个实参是类对象时,如果第一个实参是二个实参的子类,那么返回True
当第二个实参是类对象组成的元组时,如果第一个实参是第二个实参中任意一个类对象的子类,返回True
class A(object):pass
class B(object):pass
class C(object):pass
class D(A):pass
print(issubclass(D,A))
print(issubclass(D,B))
print(issubclass(D,(B,A,C)))
print(issubclass(D,(B,C)))
print(issubclass(bool,int))
print(issubclass(bool,str))
print(issubclass(bool,(str,int,dict)))
print(issubclass(bool,(str,list,dict)))
>True
False
True
False
True
False
True
False
内置函数isinstance()接受两个实参,
第一个实参是实例对象,
第二个实参是类对象或由类对象组成的元组。
当第二个实参是类对象时,如果第一个实参是二个实参的实例对象,或者第一个实参是第二个实参的子类的实例对象,那么返回True
当第二个实参是类对象组成的元组时,如果第一个实参是第二个实参中任意一个类对象或其子类的实例对象,返回True
class A(object):pass
class B(object):pass
class C(object):pass
class D(A):pass
print(isinstance(D(),D))
print(isinstance(D(),A))
print(isinstance(D(),(D,B,C)))
print(isinstance(D(),(B,A,C)))
>True
True
True
True

type()与dir()

内置函数type()用于获得指定对象的类型
实例对象的类型是其对应的类对象
类对象的类型是type,也就是说,类对象时type的一个实例对象
class MyClass(object):pass
mc = MyClass()
print(type(mc))
>
<class '__main__.MyClass'>
print(type(18))
print(type('abc'))
print(type(MyClass))
print(type(int))
>
<class 'int'>
<class 'str'>
<class 'type'>
<class 'type'>
自定义函数对象的类型是function。
内置函数对象的类型是builtin_function_or_method
def do_sth():pass
print(type(do_sth))
>
<class 'function'>
print(type(dir))
>
<class 'builtin_function_or_method'>
可以使用运算符==判断某个对象的类型是否是指定的类型
对于基本数据类型,可以直列使用其对应的类名;如果不是基本数据类型,需要使用标准库中的模块types中定义的变量
import types
print(type(do_sth) == types.FunctionType)
print(type(print) == types.BuiltinFunctionType)
>
True
True

dir()

对于指定的类对象或实例对象,可以调用内置函数dir()获得其所有可以访问的属性和方法(包括从父类中继承的属性和方法)的列表
类对象与实例对象的结果是有区别的,类对象的结果中不包括实例属性
class MyClass(object):ca = "ca"def __init__(self):self.ia = "ia"def im(self):pass@classmethoddef cm(cls):pass@staticmethoddef sm():pass
print(dir(MyClass))
>
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'ca', 'cm', 'im', 'sm']
print(dir(MyClass()))
>
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'ca', 'cm', 'ia', 'im', 'sm']

hasattr(),getattr(),setattr(),delattr()

1.hasattr(object,name)用于判断指定的对象object是否有参数name指定的属性或方法。
2.getattr(object,name[,default])用于获取指定的对象object中名为name的属性或方法
如果不指定参数default,那么当object中不存在名为name的属性和方法时,抛出AttributeError.
如果指定了参数default,那么当object中不存在名为name的属性和方法时,返回default.
getattr(object,name)等价于:object.name
3.setattr(object,name,value)用于在指定的对象object中添加或修改名为参数name的属性或方法,添加或修改后的值为value
setattr(object,name,value)等价于:object.name = value
4.delattr(object,name)用于删除指定的对象object中名为参数name的属性或方法。
delattr(object,name)等价于:del object.name
class MyClass(object):def __init__(self):self.x = 1def do_sth(self):print("do_sth被调用")
mc = MyClass()
print(hasattr(mc,'x'))
print(hasattr(mc,'do_sth'))
print(hasattr(mc,'y'))
>
True
True
False
print(getattr(mc,'x'))
>1
print(getattr(mc,'y'))
>---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-5-d4450b7ca500> in <module>()
----> 1 print(getattr(mc,'y'))AttributeError: 'MyClass' object has no attribute 'y'
print(getattr(mc,'y',2))
>2
setattr(mc,'z',3)# 等价于mc.z = 3
print(getattr(mc,'z'))
>3
delattr(mc,'z')
print(hasattr(mc,'z'))
>False

算术运算符重载

标准算术运算符在默认情况下不能用于自定义类对象的实例对象
class MyClass(object):pass
class MyClass2(object):pass
print(MyClass() + MyClass2())
>---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-fc67b776bd15> in <module>()3 class MyClass2(object):4     pass
----> 5 print(MyClass() + MyClass2())TypeError: unsupported operand type(s) for +: 'MyClass' and 'MyClass2'
如果想让标准算术运算符可以用于自定义类对象的实例对象
必须在自定义类对象中实现标准算术运算符对于的以下特殊方法:
1.+对应的特殊方法是__add__()和__radd__()
2.-对应的特殊方法是__sub__()和__rsub__()
3.*对应的特殊方法是__mul__()和__rmul__()
4./对应的特殊方法是__truediv__()和__rtruediv__()
5.//对应的特殊方法是__floordiv__()和__rfloordiv__()
class MyClass1(object):def __add__(self,other):return "这是__add__+的结果"
class MyClass2(object):def __radd__(self,other):return "这是__radd__+的结果"
obj1 = MyClass1()
obj2 = MyClass2()
print(obj1+obj2)
>
这是__add__+的结果
class MyClass1(object):pass
class MyClass2(object):def __radd__(self,other):return "这是__radd__+的结果"
obj1 = MyClass1()
obj2 = MyClass2()
print(obj1+obj2)
>
这是__radd__+的结果
class MyClass1(object):pass
class MyClass2(object):pass
obj1 = MyClass1()
obj2 = MyClass2()
print(obj1+obj2)
>---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-13-79cbfd976803> in <module>()5 obj1 = MyClass1()6 obj2 = MyClass2()
----> 7 print(obj1+obj2)TypeError: unsupported operand type(s) for +: 'MyClass1' and 'MyClass2'
class MyClass1(object):def __add__(self,other):print("特殊方法__add__被调用")return NotImplemented
class MyClass2(object):def __radd__(self,other):return "这是__radd__+的结果"
obj1 = MyClass1()
obj2 = MyClass2()
print(obj1+obj2)
>特殊方法__add__被调用
这是__radd__+的结果
class MyClass1(object):def __add__(self,other):print("特殊方法__add__被调用")return NotImplemented
class MyClass2(object):def __radd__(self,other):print("特殊方法__radd__被调用")return NotImplemented
obj1 = MyClass1()
obj2 = MyClass2()
print(obj1+obj2)
>特殊方法__add__被调用
特殊方法__radd__被调用
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-15-a92b8ee08b44> in <module>()9 obj1 = MyClass1()10 obj2 = MyClass2()
---> 11 print(obj1+obj2)TypeError: unsupported operand type(s) for +: 'MyClass1' and 'MyClass2'

面向对象编程(第四篇)相关推荐

  1. 三、Java面向对象编程有四个特征

    面向对象编程有四个特征:抽象,封装,继承,多态. 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者 对象操作,对不可信的进行信息隐藏. 继承是指使用现有类的所有功能, ...

  2. linux 脚本编写 -eq,关于shell脚本基础编程第四篇

    shell脚本基础编程第四篇 本章主要内容:函数 函数 function: function 名称 { 命令 ; } 或 name () { 命令 ; } 定义 shell 函数. 创建一个以 NAM ...

  3. JavaScript 面向对象编程(四) —— 正则表达式

    本篇为 JavaScript 进阶 ES6 系列笔记第四篇,将陆续更新后续内容.参考:JavaScript 进阶面向对象 ES6 : 系列笔记: JavaScript 面向对象编程(一) -- 面向对 ...

  4. C语言面向对象编程(四):面向接口编程

    Java 中有 interface 关键字,C++ 中有抽象类或纯虚类可以与 interface 比拟,C 语言中也可以实现类似的特性. 在面试 Java 程序员时我经常问的一个问题是:接口和抽象类有 ...

  5. [转载] Python面向对象编程系列第一篇

    参考链接: Python中的面向对象编程1(类,对象和成员) 一.类和对象 1.什么是类: 类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据的操作封装在一起,类是抽象的.类只负责描 ...

  6. php面向对象静态常量,浅谈PHP面向对象编程(四、类常量和静态成员)

    4.0 类常量和静态成员 通过上几篇博客我们了解到,类在实例化对象时,该对象中的成员只被当前对象所有.如果希望在类中定义的成员被所有实例共享. 此时可以使用类常量或静态成员来实现,接下来将针对类常量和 ...

  7. 前端学PHP之面向对象系列第四篇——关键字

    http://www.cnblogs.com/xiaohuochai/p/6063776.html 转载于:https://www.cnblogs.com/Lomio/p/6121479.html

  8. Linux Shell编程第四篇case语句

    case语句适用于需要进行多重分支的应用情况. case分支语句的格式如下: case 变量名 in 模式1) 命令序列1 ;; 模式2) 命令序列2        ;; *) 默认执行的命令序列 e ...

  9. 【Python面向对象编程】第08篇 私有变量

    本篇我们介绍封装(encapsulation)的概念,以及如何在 Python 中利用私有属性实现封装. 封装的概念 面向对象编程包含四个基本的概念:抽象.封装.继承以及多态.封装是指将数据和功能包装 ...

  10. php控制器面向对象编程,PHP 面向对象编程(2)

    一些内建方法: class Person { public $isAlive = true; function __construct($name) { //这里我们创建了一个name的属性 $thi ...

最新文章

  1. Ubuntu中配置Java环境变量时,出现command not found问题解决记录
  2. 查看进程状态信息命令 jps - (Java Virtual Machine Process Status Tool)
  3. 大连学业水平考试计算机,2016年大连市普通高中学生学业水平考试模拟题(一)
  4. 一.Spring框架基础
  5. Spring boot starter
  6. 当你打开天猫的那一刻,推荐系统做了哪些工作?
  7. java int 和 long比较大小会_解析java的addExact()与multiplyExact()
  8. java socket调用接口_java调用websocket接口
  9. 第十三届蓝桥杯青少年STEMA(2021.08-2021.03)C++
  10. ​​​​​​​ Centos7.6上用Cockpit安装oVirt
  11. list选取多个元素 python_python基础篇:list列表的操作大盘点
  12. c java通讯_java与c通讯
  13. RS232与RS485协议原理及应用
  14. 资深程序员推荐七大JavaScript编程工具
  15. PHP 密码生成器 计算生成时间
  16. 分享一个TEXT文档加密/解密编辑器
  17. XP系统优化超简单实用版
  18. 又多了一重身份,继续前行
  19. 【实用】OS X Lion restore Recovery HD Manually 手工创建 OS X Lion 恢复分区
  20. Linux系统Sudo命令的使用说明

热门文章

  1. 牛客题霸 NC23 划分链表
  2. CG CTF WEB SQL Injection
  3. mysql卸载后root还在_CentoOs7 Mysql卸载后重新安装缺少/root/.mysql_secret
  4. mysql 共享锁和排他锁 意向锁 记录锁 Gap Locks Next-Key Locks 插入意向锁介绍
  5. spring-boot-maven-plugin插件找不到含有main的主类
  6. 关于tomcat出现闪退问题
  7. Dingo Api 入门
  8. Python 去除序列s中的重复元素
  9. 链接二叉树中同一层的节点
  10. lca---tarjan算法