Python获取对象信息

系统 1595 0

1、使用type()

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

基本类型的判断:
            
              >>> type(123)
>
              
                
>>>> type('str')
>
                
                  
>>>> type(None)
>
                  
                  
                
              
            
          
用 type() 判断一个变量指向函数或者类:
            
              >>> type(abs)  #函数

              
                
>>> type(a)    #类

                
                
              
            
          
比较变量的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'

              
                <__main__.MyObject object at 0x108ca35d0>>
>>> fn = getattr(obj, 'power') # 获取属性'power'并赋值到变量fn
>>> fn # fn指向obj.power

                
                  <__main__.MyObject object at 0x108ca35d0>>
>>> fn() # 调用fn()与调用obj.power()是一样的
81

                
              
            
          

更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论