获取对象信息
当我们拿到一个对象时,如何知道这个对象是什么类型、有哪些方法呢?
#!/usr/bin/env python
#-*- coding:utf-8 -*-
u'note of learning python'
__author__ = 'Master.Li'
import sys
import math
from collections import Iterable
import os
import functools
from PIL import Image
import workspace.module1._42
import types
# ★判断对象类型,使用type() 函数,因为一切均是对象,所以几乎所有类型均可以使用type()判断
# type() 函数返回type类型,可以利用返回值判断两个变量或对象的类型是否相同
print type(123) # <type 'int'>
print type('123') # <type 'str'>
print type([1,2,'3']) # <type 'list'>
print type((1,'2',3)) # <type 'tuple'>
class Animal():
def run(self):
print 'Animal is running...'
class Dog(Animal):
def run(self):
print 'Dog is running...'
a = Animal()
d1 = Dog()
d2 = Dog()
print type(a) # <type 'instance'>
print type(d1) # <type 'instance'>
print type(d1) == type(d2)
# 上述比较类型是针对两个变量的,其实Python把每种type类型都定义好了常量,放在types模块里,使用之前,需要先导入,这样就可以判断单个变量的类型了
# 常量types.NoneType/IntType/LongType/FloatType/ComplexType/StringType/UnicodeType/oleanTyp/TypeType...
print types.StringType == type('123')
print types.ClassType == type(Animal)
print types.InstanceType == type(a)
print type(int)==types.TypeType # 特别的TypeType ,所有类型本身的类型就是TypeType
# 因为对于类来说存在继承关系,所以使用type()就不是很方便了,对于class类型,判断class的类型,可以使用isinstance() 函数
print u'对象a是否是Animal类型:', isinstance(a, Animal)
print u'对象a是否是Dog类型:', isinstance(a, Dog)
print u'对象d是否是Dog类型:', isinstance(d1, Dog)
print u'对象d是否是Animial类型:', isinstance(d1, Animal)
# ★ 能用type() 判断的基本类型也可以用isinstance() 判断。并且还可以判断一个变量是否是某些类型中的一种
print u'对象a是否是Animal或Dog类型:', isinstance(a, (Animal, Dog))
# ★获得一个对象的所有属性和方法,可以使用dir() 函数,它返回一个包含字符串的list
print dir('abc') # 以字符串为例,可以得到字符串的所有处理函数
# 类似__xxx__ 的属性和方法在Python中都是有特殊用途的,比如__len__ 方法返回长度
# 用len()试图获取一个对象的长度,实际上,在len()内部,它自动去调用该对象的__len__() 方法
print len('abc')
print 'abc'.__len__()
print u'字符串变大写:','abc'.upper()
# 对于自定义的类,如果想调用它的什么方法,可以写一个相应的方法
class Cat(Animal):
def __init__(self,name):
self.name = name
def __len__(self):
return 100
def run(self):
print 'Cat is running...'
def set_height(self,height):
self.height = height
c = Cat('kit')
print len(c)
print c.__len__()
# ★可以使用getattr() 、setattr() 以及hasattr()操作一个对象的属性状态
print u'该类有name属性吗?:', hasattr(c, 'name')
print u'该类有height属性吗?:', hasattr(c, 'height')
setattr(c, 'height', 200)# 设置属性height,(对象名,属性名,属性的值)
print u'现在该对象有height属性吗?:', hasattr(c, 'height')
print u'现在该对象的height属性值:', getattr(c, 'height')
# 如果试图getattr()不存在的属性,系统将抛出AttributeError错误
# print getattr(c, 'weight')
# getattr()函数可以传入一个default参数,如果获取不存在属性的值,就返回默认值
print u'带错误值的getattr()函数:', getattr(c, 'lenght','404 Not Found')
# 通过getattr()获得对象的方法
print u'该对象有run属性吗?:', hasattr(c, 'run') # 方法也是属性
print u'该对象的run属性值:', getattr(c, 'run')# <bound method Cat.set_height of <__main__.Cat instance at0x023C6698>>
fn = getattr(c, 'run')
fn()
运行效果:
★★小结:通过一系列的内置函数,可以对任意一个Python对象进行剖析
但是,要注意的是,只有在不知道对象信息的时候,才会利用内置函数获取对象信息,否则,只会多此一举
例:从文件流fp中读取图像,我们首先要判断该fp对象是否存在read方法,如果存在,则该对象是一个流,如果不存在,则无法读取
fp = Image.open(r'C:\Users\Public\Pictures\Sample Pictures\1.jpg')
def readImage(fp):
if hasattr(fp, 'read'):
return readData(fp)
return None
print readImage(fp)