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

 

#!/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 未知变量x1 x2 x3_字符串


★★小结:通过一系列的内置函数,可以对任意一个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)