美文网首页
Python自省

Python自省

作者: Treehl | 来源:发表于2018-05-30 08:14 被阅读0次

    参考自廖雪峰的Python教程

    Python自省-------在运行时能够获得对象的类型

    • type(),判断对象类型
    • dir(), 带参数时获得该对象的所有属性和方法;不带参数时,返回当前范围内的变量、方法和定义的类型列表
    • isinstance(),判断对象是否是已知类型
    • hasattr(),判断对象是否包含对应属性
    • getattr(),获取对象属性
    • setattr(), 设置对象属性

    1、type()

    type()返回对应的class类型

    In [27]: type(123)
    Out[27]: int
    
    In [28]: type('123')
    Out[28]: str
    
    In [29]: type(None)
    Out[29]: NoneType
    

    2、dir()

    不带参数

    >>> dir()
    ['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
    

    带参数

    dir('ABC')
    ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
    
    

    这里看下len()

    len()函数返回字符长度

    >>> len('ABC')
    3
    
    在len()函数内部,它自动去调用该对象的__len__()方法
    
    
    >>> 'ABC'.__len__()
    3
    
    

    看个函数

    In [34]: class Mydog(object):
        ...:     def __len__(self):
        ...:         return 100
        ...:
    
    In [35]: mydog = Mydog()
    
    In [36]: len(mydog)
    Out[36]: 100
    
    

    3、isinstance()

    判断a数据类型是不是list

    In [37]: a = [1, 2, 3]
    
    In [38]: isinstance(a, list)
    Out[38]: True
    

    getattr、hasattr、setattr获取对象的状态

    In [1]: class Myobject(object):
       ...:     def __init__(self):
       ...:         self.x = 9
       ...:     def power(self):
       ...:         return self.x * self.x
       ...:
    
    In [2]: obj = Myobject()
    
    In [3]: obj.power()
    Out[3]: 81
    
    In [4]: hasattr(obj, 'x') # 有属性x么?
    Out[4]: True
    
    In [5]: hasattr(obj, 'y') # 有属性y么?
    Out[5]: False
    
    In [6]: setattr(obj, 'y') # 设置属性必须有三个参数,少了值
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-6-3b0a0f22117d> in <module>()
    ----> 1 setattr(obj, 'y')
    
    TypeError: setattr expected 3 arguments, got 2
    
    In [7]: setattr(obj, 'y', 100) # 设置属性y的值为100
    
    In [8]: hasattr(obj, 'y') # 有属性y么?
    Out[8]: True
    
    In [9]: getattr(obj, 'y') # 获取属性y!
    Out[9]: 100
    
    In [10]: obj.y # 获取属性y
    Out[10]: 100
    
    In [11]: obj.x # 获取属性x
    Out[11]: 9
    
    

    获取不存在的属性,会抛出AttributeError

    In [12]: getattr(obj, 'z')
    ---------------------------------------------------------------------------
    AttributeError                            Traceback (most recent call last)
    <ipython-input-12-95c3c0ec4e01> in <module>()
    ----> 1 getattr(obj, 'z')
    
    AttributeError: 'Myobject' object has no attribute 'z'
    

    可以传入一个默认参数,不存在就抛出默认参数

    
    In [13]: getattr(obj, 'z', 404)
    Out[13]: 404
    

    相关文章

      网友评论

          本文标题:Python自省

          本文链接:https://www.haomeiwen.com/subject/lnazjftx.html