Python获取对象信息

1、使用type()

type()函数:判断对象类型

基本类型的判断:
>>> type(123)
><type 'int'>
>>>> type('str')
><type 'str'>
>>>> type(None)
><type 'NoneType'>
用 type() 判断一个变量指向函数或者类:
>>> type(abs)  #函数
<type 'builtin_function_or_method'>
>>> type(a)    #类
<class '__main__.Animal'>
比较变量的type类型

Python的 types 模块里为定义好常量的type类型,在使用之前需要先导入

>>> import types
>>> type('abc')==types.StringType
True
>>> type(u'abc')==types.UnicodeType
True
>>> type([])==types.ListType
True
>>> type(str)==types.TypeType      #所有类型本身的类型就是 TypeType
True
2、使用isinstance()
判断class类型

如果继承关系是:

判断一个对象是否是某种类型,首先创建对象:

object -> Animal -> Cat -> Amy
>>> h = Amy()

判断:

>>> isinstance(h, Husky)
True        # 因为h变量指向的就是Husky对象。
isinstance() 判断的是一个对象是否是该类型本身,或位于该类型的父继承链上:
>>> isinstance(h, Dog)
True
>>> isinstance(h, Animal)
True
判断基本类型,类似type()
>>> isinstance('a', str)
True
>>> isinstance(u'a', unicode)
True
判断一个变量是否是某些类型中的一种
>>> isinstance('a', (str, unicode))
True
>>> isinstance(u'a', (str, unicode))
True
3、使用dir()

dir() 函数:获得一个对象的所有属性和方法,返回一个包含字符串的list

>>> dir('abc')  # 获得一个str对象的属性和方法
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribu
te__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__',
'__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmu
l__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parse
r', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isa
lnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'part
ition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswit
h', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

类似 __xxx__ 的属性和方法在Python中都是有特殊用途的,为特殊属性/方法。
在Python中,如果调用 len() 函数试图获取一个对象的长度,实际上,在 len() 函数内部,它自动去调用该对象的 __len__() 方法。
下面的代码是等价的:

>>> len('abc')
3
>>> 'abc'.__len__()
3

其余是普通属性或方法,比如 lower() 返回小写的字符串:

>>> 'ABC'.lower()
'abc
4、获取并测试对象的属性和方法

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

>>> class MyObject(object):
... def __init__(self):
... self.x = 9
... def power(self):
... return self.x * self.x
...
>>> obj = MyObject()
测试对象属性:
>>> hasattr(obj, 'x') # obj对象有属性'x'吗?
True
>>> obj.x
9
>>> hasattr(obj, 'y') # 有属性'y'吗?
False
>>> setattr(obj, 'y', 19) # 设置一个属性'y'
>>> hasattr(obj, 'y') 
True
>>> getattr(obj, 'y') # 获取obj对象的属性'y'
19
>>> obj.y 
19

注意:如果试图获取不存在的属性,会抛出AttributeError的错误。
**解决:**传入default参数,如果属性不存在,就返回默认值:

>>> getattr(obj, 'z', 404) # 获取属性'z',如果不存在,返回默认值404
404
获得对象的方法:
>>> hasattr(obj, 'power') # obj对象有属性'power'吗?
True
>>> getattr(obj, 'power') # 获取属性'power'
<bound method MyObject.power of <__main__.MyObject object at 0x108ca35d0>>
>>> fn = getattr(obj, 'power') # 获取属性'power'并赋值到变量fn
>>> fn # fn指向obj.power
<bound method MyObject.power of <__main__.MyObject object at 0x108ca35d0>>
>>> fn() # 调用fn()与调用obj.power()是一样的
81
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值