python获取对象属性:dir()函数 、obj.__dict__ 、obj.inspect.getmebers

一、Python __dict__与dir()

Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案。

__dict__与dir()的区别:

  1. dir()是一个函数,返回的是list;
  2. __dict__是一个字典,键为属性名,值为属性值;__dict__包含了模块里可用的属性名-属性的字典;也就是可以使用模块名.属性名访问的对象。
  3. dir()用来寻找一个对象的所有属性,包括__dict__中的属性,__dict__是dir()的子集;

并不是所有对象都拥有__dict__属性。许多内建类型就没有__dict__属性,如list、dict、init,此时就需要dir() 来列出对象的所有属性。

二、__dict__属性

__dict__是用来存储对象属性的一个字典,其键为属性名,值为属性的值。

#!/usr/bin/python
# -*- coding: utf-8 -*-
class A(object):
    class_var = 1
    def __init__(self):
        self.name = 'xy'
        self.age = 2

    @property
    def num(self):
        return self.age + 10

    def fun(self):pass
    def static_f():pass
    def class_f(cls):pass

if __name__ == '__main__':#主程序
    a = A()
    print a.__dict__   
    # {'age': 2, 'name': 'xy'}   实例中的__dict__属性
    
    print A.__dict__   
    
    '''
    类A的__dict__属性
    {
    '__dict__': , 
    '__module__': '__main__',               #所处模块
    'num': ,               #特性对象 
    'class_f': ,          #类方法
    'static_f': ,        #静态方法
    'class_var': 1, 'fun': , #类变量
    '__weakref__': , 
    '__doc__': None,                        #class说明字符串
    '__init__': }
    '''

    a.level1 = 3
    a.fun = lambda :x
    print a.__dict__  
    #{'level1': 3, 'age': 2, 'name': 'xy','fun':  at 0x>}
    
    print A.__dict__  #与上述结果相同  上个 print A.__dict__ 

    A.level2 = 4
    print a.__dict__  #{'level1': 3, 'age': 2, 'name': 'xy'}
    print A.__dict__  #增加了level2属性

    print object.__dict__
    '''
	{'__setattr__': , '__reduce_ex__': ,
	 '__new__': , '__reduce__': , 
	 '__str__': , '__format__': , 
	 '__getattribute__': , '__class__': ,
	  '__delattr__': , '__subclasshook__': ,
	   '__repr__': , '__hash__': ,
	    '__sizeof__': , '__doc__': 'The most base type', '__init__': }
    '''

A.dict 中没有a.__dict__的一些属性,如age ,因为__dict__属性是该对象可访问的。age是A访问不到的,必须实例化才能用实例对象访问。
同样的class_f属性这个是a访问不到的,所以a.__dict__没有这个值。

简单说:
  1) 内置的数据类型没有__dict__属性

2) 每个类有自己的__dict__属性,就算存着继承关系,父类的__dict__ 并不会影响子类的__dict__

3) 对象也有自己的__dict__属性, 存储self.xxx 信息,父子类对象公用__dict__

三、dir()函数


1、dir()作用在实例上时,显示实例变量还有在实例变量所在类及所有它的基类中定义的方法和属性
2、dir()作用在类上时,显示类及所有它的基类中__dict__的内容,不包括元类
3、dir()作用在模块上时,显示模块的__dict__的内容
4、dir()不带参数时显示调用者的局部变量,等价于locals(),但返回的不是字典

​dir()是Python提供的一个API函数,dir()函数会自动寻找一个对象的所有属性(包括从父类中继承的属性)。

​ 一个实例的__dict__属性仅仅是那个实例的实例属性的集合,并不包含该实例的所有有效属性。所以如果想获取一个对象所有有效属性,应使用dir()。

print dir(A)
'''
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'class_f', 'class_var', 'fun', 'level1', 'level2', 'name', 'num', 'static_f']
'''
a_dict = a.__dict__.keys()
A_dict = A.__dict__.keys()
object_dict = object.__dict__.keys()
print a_dict  
print A_dict  
print object_dict 
'''
['fun', 'level1', 'age', 'name']

['__module__', 'level2', 'num', 'static_f', '__dict__', '__weakref__', '__init__', 'class_f', 'class_var', 'fun', '__doc__']

['__setattr__', '__reduce_ex__', '__new__', '__reduce__', '__str__', '__format__', '__getattribute__', '__class__', '__delattr__', '__subclasshook__', '__repr__', '__hash__', '__sizeof__', '__doc__', '__init__']
'''

#因为每个类都有一个__doc__属性,所以需要去重,去重后然后比较
# dir()作用在实例上,显示实例变量a、还有在实例变量所在类A、及所有它的基类中定义的方法和属性
print set(dir(a)) == set(a_dict + A_dict + object_dict)  #True

四、inspect.getmebers

Inspect.getmembers(object [, predicate])
返回的内容比对象的__dict__包含的内容多,源码是通过dir()实现的。
这个方法是dir()的扩展版,它会将dir()找到的名字对应的属性一并返回,形如[(name, value), …]。
返回object的所有成员。
通常, 通过查找对象的__dict__属性来得到这些成员, 但是该函数可能返回存储在其他地方的object属性。例如, __doc__中的文档字符串, __name__中的对象名等。返回的成员都是一个(name, value)对列表。predicate是一个可选函数, 它将一个成员对象作为参数, 并返回True或False。只有predicate返回True时成员才被返回。像isfunction()和isclass()这样的函数可以用作判断函数。

getmembers(object[, predicate])

返回一个包含对象的所有成员的(name, value)列表。返回的内容比对象的__dict__包含的内容多,源码是通过dir()实现的。

predicate是一个可选的函数参数,被此函数判断为True的成员才被返回。

getmodule(object)

返回定义对象的模块

getsource(object)

返回对象的源代码

getsourcelines(object)

返回一个元组,元组第一项为对象源代码行的列表,第二项是第一行源代码的行号

ismodule,isclass,ismethod,isfunction,isbuiltin

一系列判断对象类型的方法,大都是包装了isinstance(object, types.FunctionType)之类语句的函数。

现在可以用类型判断来返回一个类的方法了:

class Foo(object):
‘’‘Foo doc’’’
def init(self, name):
self.__name = name

def getname(self):
    return self.__name

inspect.getmembers(Foo, inspect.ismethod)

https://www.cnblogs.com/zjchao/p/7894477.html

你可能感兴趣的:(Python)