Python面向对象-获取对象信息type()、isinstance()、dir()
type()
type()函数用于判断对象类型:
>>> type(11)
<class 'int'>
>>> type('abc')
<class 'str'>
>>> type(None)
<class 'NoneType'>
>>> type(abs)
<class 'builtin_function_or_method'>
>>> type(a)
<class 'list'>
type()返回的是对应class类型。下面是判断两个变量的type类型是否相同:
>>> type(11) == type(22)
True
>>> type('abc') == str
True
>>> type('abc') == type(33)
False
如何判断一个对象是否是函数呢?使用types模块中定义的常量:
>>> import types
>>> def f():
... pass
...
>>> type(f)
<class 'function'>
>>> type(f) == types.FunctionType
True
>>> type(lambda x:x) == types.LambdaType
True
>>> type((x for x in range(10))) == types.GeneratorType
True
isinstance()
如果存在以下继承关系:object->Animal->Dog->Husty
那么,isinstance()可以告诉我们,一个对象是否是某种类型(续用上篇文章的例子):
>>> class Husty(Dog):
... pass
...
>>> a = Animal()
>>> b = Dog()
>>> c = Husty()
>>> isinstance(c,Husty)
True
>>> isinstance(c,Dog)
True
>>> isinstance(c,Animal)
True
>>> isinstance(b,Husty)
False
我们可以说Husty是Husty、Dog、Animal类型的对象,却不能说Dog是Husty的对象。应该不难理解吧。
isinstance()同样可以用来判断基本数据类型,甚至可以判断一个变量是否是某些类型中的一种:
>>> isinstance('abc',str)
True
>>> isinstance(22,int)
True
>>> isinstance([1,2,3,4],(list,tuple))
True
>>> isinstance((1,2,3,4),(list,tuple))
True
dir()
用于获取一个对象的所有方法和属性。返回值是一个包含字符串的list:
>>> dir('abc')
['__add__', '__class__',…… '__hash__', '__init__', '__i
……'isalnum
 'isidentifier', 'islower', …… 'translate', 'upper', 'zfill']
其中,类似__xx__的属性和方法都是有特殊用途的。如果调用len()函数视图获取一个对象的长度,其实在len()函数内部会自动去调用该对象的__len__()方法,等价于:
>>> len('abc')
3
>>> 'abc'.__len__()
3
据此,我们自己在定义类的时候,自己写一个__len__()方法,就可以使用len(实例变量)功能:
>>> class MyObj(object):
... def __len__(self):
... return 55
...
>>> obj = MyObj()
>>> len(obj)
55
往往我们仅仅列出属性和方法还是不够的,配合getattr()、setattr()、hasattr(),我们可以直接操作一个对象的状态:
>>> class MyObj(object):
... def __init__(self):
... self.x = 9
... def power(self):
... return self.x * self.x
...
>>> obj = MyObj()
>>> hasattr(obj,'x')
True
>>> obj.x
9
>>> hasattr(obj,'y')
False
>>> setattr(obj,'y',22)
>>> hasattr(obj,'y')
True
>>> obj.y
22
>>> getattr(obj,'y')
22
还可以传入一个默认参数,如果属性不存在,返回默认值:
>>> getattr(obj,'h','该页面不存在')
'该页面不存在'
再来演示如何获得对象的方法:
>>> hasattr(obj,'power')
True
>>> f = getattr(obj,'power')
>>> f
<bound method MyObj.power of <__main__.MyObj object at 0x029FD250>>
>>> f()
81
Python面向对象-获取对象信息type()、isinstance()、dir()的更多相关文章
- python 面向对象五 获取对象信息 type isinstance  getattr setattr hasattr
		
一.type()函数 判断基本数据类型可以直接写int,str等: >>> class Animal(object): ... pass ... >>> type( ...
 - python基础——获取对象信息
		
python基础——获取对象信息 当我们拿到一个对象的引用时,如何知道这个对象是什么类型.有哪些方法呢? 使用type() 首先,我们来判断对象类型,使用type()函数: 基本类型都可以用type( ...
 - Python面向对象 -- 继承和多态、获取对象信息、实例属性和类属性
		
继承和多态 继承的好处: 1,子类可以使用父类的全部功能 2,多态:当子类和父类都存在相同的方法时,子类的方法会覆盖父类的方法,即调用时会调用子类的方法.这就是继承的另一个好处:多态. 多态: 调用方 ...
 - python 面向对象编程、获取对象信息
		
面向对象与面向过程 参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0 ...
 - python 获取对象信息
		
当我们拿到一个对象的引用时,如何知道这个对象是什么类型.有哪些方法呢? 使用type() 首先,我们来判断对象类型,使用type()函数: 基本类型都可以用type()判断: >>> ...
 - 【Python】[面性对象编程]  获取对象信息,实例属性和类属性
		
获取对象信息1.使用isinstance()判断class类型2.dir() 返回一个对象的所有属性和方法3.如果试图获取不存在的对象会抛出异常[AttributeError]4.正确利用对象内置函数 ...
 - python获取对象信息
		
获取对象信息 拿到一个变量,除了用 isinstance() 判断它是否是某种类型的实例外,还有没有别的方法获取到更多的信息呢? 例如,已有定义: class Person(object): def ...
 - python类的继承和多态,获取对象信息
		
继承 类的继承机制使得子类可以继承父类中定义的方法,拥有父类的财产,比如有一个Animal的类作为父类,它有一个eat方法: class Animal(object): def __init__(se ...
 - python动态获取对象的属性和方法 (转载)
		
首先通过一个例子来看一下本文中可能用到的对象和相关概念. #coding:utf-8 import sys def foo():pass class Cat(object): def __init__ ...
 
随机推荐
- CSS中如果实现元素浮动,看这篇文章就足够了
			
浮动基本介绍 在标准文档流中元素分为2种,块级元素和行内元素,如果想让一些元素既要有块级元素的特点也同时保留行内元素特点,只能让这些元素脱离标准文档流即可. 浮动可以让元素脱离标准文档流,可以实现让多 ...
 - js对象的直接赋值、浅拷贝与深拷贝
			
最近Vue项目中写到一个业务,就是需要把对话框的表单中的数据,每次点击提交之后,就存进一个el-table表格中,待多次需要的表单数据都提交进表格之后,再将这个表格提交,实现多个表单数据的同时提交,期 ...
 - tensorflow:模型的保存和训练过程可视化
			
在使用tf来训练模型的时候,难免会出现中断的情况.这时候自然就希望能够将辛辛苦苦得到的中间参数保留下来,不然下次又要重新开始. 保存模型的方法: #之前是各种构建模型graph的操作(矩阵相乘,sig ...
 - Django2.2  Templates 页面渲染 数据列表跳转 以及简单的页面模块继承
			
声明:本博客用的为pycharm Django2.2,基于此内容,会简单讲解 数据库传参形式的增删查改(完整小项目) 路由的 位置参数.关键字参数.以及html中反向解析路由 request的表单传递 ...
 - php权重分配
			
假设有3个人 能力的权重 分别为 A=>1,B=>2,C=>3,那么当有6个案子的时候 A分配到1个,B分配到2个,C分配到3个,这很合理,但是当案子只有5个,或者有7个的时候, ...
 - 创建raid10(五块磁盘)
			
创建raid10(五块磁盘) Raid10(5块磁盘) 上一个bolg已经做了raid5(3 个raid. 2个备份),在此条件下继续以下步骤: 1.先将磁盘系统卸载 2.看系统挂载里是否还有md0 ...
 - 基于VMware Workstation下Windows server的搭建
			
网络安全学习内容 一.VMware安装Windows系统 1.1安装配置虚拟机 需要提前准备的东西: 配置网络实验室的IP: 为了满足实验中一些需要用到网络的需求,学校为我们提供了每个人学号密码的 ...
 - luogu P5414 [YNOI2019]排序 |动态规划
			
题目描述 对于一个数列{7, 1, 2, 3}进行排序,我们可以把7 从头移动到尾.但是这个操作的成本是7,并不是最佳的.最佳的排序方式是将连续的1.2.3 移动到7 的前面.这样的话,总的操作成本就 ...
 - http状态码_____ 204/206/200
			
HTTP的状态码有很多种,主要有五个大类 1xx(临时响应) 2xx(成功) 3xx(已重定向) 4xx(请求错误) 5xx(服务器错误) 每个大类还对应一些具体的分类.平时我们接触比较多的是200. ...
 - linux google protobuf
			
说明: protobuf已经全面迁移到github,地址:https://github.com/google/protobuf 直接下载2.6.1版本:https://github.com/googl ...