当我们拿到一个对象的引用时,如何知道这个对象是什么类型、有哪些方法呢?

基本类型都可以用type()判断:

print(type(123))
print(type('str'))
print(type(True))

如果一个变量指向函数或者类,也可以用type()判断:

class Animal(object):
pass
a = Animal()
print(type(abs))#指向函数
print(type(a))#指向类

type()函数返回对应的Class类型,如果我们要在if语句中判断,就需要比较两个变量的type类型是否相同:

print(type(123)==type(345))
print(type(13)==int)
#判断基本数据类型可以直接写int,str等
#但如果要判断一个对象是否是函数怎么办?可以使用types模块中定义的常量:
import types
def fn():
pass
print(type(fn)==types.FunctionType)
print(type(abs)==types.BuiltinFunctionType)
print(type(lambda x: x)==types.LambdaType)
print(type((x for x in range(10)))==types.GeneratorType)

使用isinstance()

对于class的继承关系来说,使用type()很不方便,可以使用isinstance()

print(isinstance('a',str))

#基本类型也可以用isinstance()判断:
print(isinstance([1, 2, 3], (list, tuple)))
print(isinstance((1, 2, 3), (list, tuple)))

并且还可以判断一个变量是否是某些类型中的一种,比如下面的代码就可以判断是否是list或者tuple:

总是优先使用isinstance()判断类型,可以将指定类型及其子类“一网打尽”。

使用dir()

如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list

print(dir('abc'))

类似__xxx__的属性和方法在Python中都是有特殊用途的,比如__len__方法返回长度

在Python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,

它自动去调用该对象的__len__()方法,所以,下面的代码是等价的:

print(len('abc'))
print('abc'.__len__())

仅仅把属性和方法列出来是不够的,配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态:

class MyObject(object):
def __init__(self):
self.x = 9
def power(self):
return self.x * self.x
obj = MyObject()

紧接着,可以测试该对象的属性:

print(hasattr(obj,'x'))#有属性'x'吗
print(obj.x)
print(hasattr(obj,'y'))#有属性'y'吗
setattr(obj,'y',19)#设置一个属性y叫19
print(hasattr(obj,'y'))#有属性'y'吗
print(getattr(obj,'y'))#获取属性'y'
#getattr(obj,'z')#获取不存在的属性会报错
print(getattr(obj,'z',404))#可以传入一个值,如果没,就返回值

也可以获得对象的方法:

print(hasattr(obj, 'power')) # 有属性'power'吗?
getattr(obj,'power')#获取属性
fn = getattr(obj,'power')#获取属性'power'并赋值到变量fn
print(fn)# fn指向obj.power
print(fn())#调用fn()与调用obj.power()是一样的

小结

通过内置的一系列函数,我们可以对任意一个Python对象进行剖析,拿到其内部的数据。

要注意的是,只有在不知道对象信息的时候,我们才会去获取对象信息

sum = obj.x + obj.y#可以直接这样写,就绝不要下面的写法
sum = getattr(obj, 'x') + getattr(obj, 'y')

一个正确的例子

def readImage(fp):
if hasattr(fp, 'read'):
return readData(fp)
return None

假设我们希望从文件流fp中读取图像,我们首先要判断该fp对象是否存在read方法,如果存在,则该对象是一个流,如果不存在,则无法读取。hasattr()就派上了用场。

Python3学习笔记20-获取对象信息的更多相关文章

  1. Unity学习笔记(3):获取对象

    在上一篇文章中(Unity映射注册)中概要介绍了Unity中的映射机制,本节主要介绍对象获取,包括默认获取,通过名称获取,获取全部对象,同时通过加载配置文件,然后再获取对象. 通过代码获取对象 方式1 ...

  2. Python3类和实例之获取对象信息

    当我们拿到一个对象的引用时,如何知道这个对象是什么类型,有哪些方法呢 使用type() 判断对象类型使用type()函数 基本类型都可以用type()判断 <class 'int'> &g ...

  3. Python3学习笔记(urllib模块的使用)转http://www.cnblogs.com/Lands-ljk/p/5447127.html

    Python3学习笔记(urllib模块的使用)   1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None,  ...

  4. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  5. SQL反模式学习笔记20 明文密码

    目标:恢复或重置密码 反模式:使用明文存储密码 1.存储密码 使用明文存储密码或者在网络上传递密码是不安全的. 如果攻击者截取到你用来插入(或者修改)密码的sql语句,就可以获得密码.     黑客获 ...

  6. JavaScript:学习笔记(10)——XMLHttpRequest对象

    JavaScript:学习笔记(10)——XMLHttpRequest对象 XHR对象 使用XMLHttpRequest (XHR)对象可以与服务器交互.您可以从URL获取数据,而无需让整个的页面刷新 ...

  7. python基础——获取对象信息

    python基础——获取对象信息 当我们拿到一个对象的引用时,如何知道这个对象是什么类型.有哪些方法呢? 使用type() 首先,我们来判断对象类型,使用type()函数: 基本类型都可以用type( ...

  8. python获取对象信息

    获取对象信息 拿到一个变量,除了用 isinstance() 判断它是否是某种类型的实例外,还有没有别的方法获取到更多的信息呢? 例如,已有定义: class Person(object): def ...

  9. Python3学习笔记 - 准备环境

    前言 最近乘着项目不忙想赶一波时髦学习一下Python3.由于正好学习了Docker,并深深迷上了Docker,所以必须趁热打铁的用它来创建我们的Python3的开发测试环境.Python3的中文教程 ...

随机推荐

  1. # BZOJ5300 [CQOI2018]九连环 题解 | 高精度 FFT

    今天做了传说中的CQOI六道板子题--有了一种自己很巨的错觉(雾 题面 求n连环的最少步数,n <= 1e5. 题解 首先--我不会玩九连环-- 通过找规律(其实是百度搜索)可知,\(n\)连环 ...

  2. Java核心技术-并发

    多任务(multitasking):在同一时刻运行多个程序的能力. 并发执行的进程数目并不是由CPU数目制约的.操作系统将CPU的时间片分配给每一个进程,给人并发处理的感觉. 多线程程序在较低的层次上 ...

  3. A1097. Deduplication on a Linked List

    Given a singly linked list L with integer keys, you are supposed to remove the nodes with duplicated ...

  4. 通过纯真IP地址实现根据用户地址显示信息

    为了实现中关村在线商品报价中通过用户的地理位置信息显示相应的报价. 示例地址:http://detail.zol.com.cn/lens/index224693.shtml 现把我做的使用asp.ne ...

  5. ModuleNotFoundError: No module named 'Crypto.Cipher'

    ModuleNotFoundError: No module named 'Crypto.Cipher'报错问题 原因及处理: 在使用python3是经常会用到import一个第三方库,但是有时候会提 ...

  6. java程序中加入@SuppressWarnings("serial")是什么意思?

    比如有个类实现了java.io.Serialize接口:package com.onede4.test; public class TestSerial implements java.io.Seri ...

  7. php 配置文件不加载的一次配置

    最近在一台服务器上安装配置了5.6和7.1两个版本的php,之前是5.6的.使用都正常,7.1是后期安装的. 问题: 在7.1的程序目录中命名的配置文件为:php7-9026.ini,同时安装并在配置 ...

  8. Spark记录-SparkSQL一些操作

    scala>val spark=new org.apache.spark.sql.SQLContext(sc) user.json {"age":"45" ...

  9. JAVA记录-@Controller和RequestMapping注解代码介绍

    1.spring-mvc.xml加入配置 <!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 --> <context:component ...

  10. 枚举专项练习_Uva725(Division)_Uva11059(Maximun Product)

    //Uva725 #include <iostream> #include <cstring> #include <cstdlib> #include <cs ...