Python __dict__与dir()区别

Python __dict__与dir()

转载请标明出处(http://blog.csdn.net/lis_12/article/details/53521554).

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

__dict__与dir()的区别:

  1. dir()是一个函数,返回的是list;
  2. __dict__是一个字典,键为属性名,值为属性值;
  3. dir()用来寻找一个对象的所有属性,包括__dict__中的属性,__dict__是dir()的子集;

? 并不是所有对象都拥有__dict__属性。许多内建类型就没有__dict__属性,如list,此时就需要用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__‘: <attribute ‘__dict__‘ of ‘A‘ objects>, #这里如果想深究的话查看参考链接5
    ‘__module__‘: ‘__main__‘,               #所处模块
    ‘num‘: <property object>,               #特性对象
    ‘class_f‘: <function class_f>,          #类方法
    ‘static_f‘: <function static_f>,        #静态方法
    ‘class_var‘: 1, ‘fun‘: <function fun >, #类变量
    ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘A‘ objects>,
    ‘__doc__‘: None,                        #class说明字符串
    ‘__init__‘: <function __init__ at 0x0000000003451AC8>}
    ‘‘‘

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

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

    print object.__dict__
    ‘‘‘
    {‘__setattr__‘: <slot wrapper ‘__setattr__‘ of ‘object‘ objects>,
    ‘__reduce_ex__‘: <method ‘__reduce_ex__‘ of ‘object‘ objects>,
    ‘__new__‘: <built-in method __new__ of type object at>,
    等.....
    ‘‘‘

从上述代码可知,

  1. 实例的__dict__仅存储与该实例相关的实例属性,

    正是因为实例的__dict__属性,每个实例的实例属性才会互不影响。

  2. 类的__dict__存储所有实例共享的变量和函数(类属性,方法等),类的__dict__并不包含其父类的属性。

?

dir()函数

? 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__属性,所以需要去重,去重后然后比较
print set(dir(a)) == set(a_dict + A_dict + object_dict)  #True

结论

dir()函数会自动寻找一个对象的所有属性,包括__dict__中的属性。

__dict__是dir()的子集,dir()包含__dict__中的属性。

参考网址

  1. https://docs.python.org/2/howto/descriptor.html?highlight=descriptor%20protocol#id1
  2. http://stackoverflow.com/questions/4877290/what-is-the-dict-dict-attribute-of-a-python-class
  3. http://www.tuicool.com/articles/ZbQFF3u
  4. http://www.jb51.net/article/54540.htm
  5. http://blog.csdn.net/lis_12/article/details/53519060

原文地址:https://www.cnblogs.com/YingxuanZHANG/p/8805836.html

时间: 2024-10-13 04:21:24

Python __dict__与dir()区别的相关文章

python __dict__ 跟 dir()的区别

__dict__:要是对象的话返回的是一个对象自身的实例属性.不包括类的属性:要是类的__dict__则不包括父类的属性,只包含自身类属性[方法.类变量],不包括实例属性.正是这样.每个实例的实例属性才会互不影响. dir():返回的是对象的所有属性.包括父类的属性 python一切皆对象.类本身也有__dict__函数.跟dir()函数.那么类与实例的两个函数有没有区别呢? 答案是:有的 class A(): Tang = "tang" def __init__(self): sel

python的dir()和__dict__属性的区别

只要是有属性的数据对象(不一定是面向对象的对象实例,而是指具有数据类型的数据对象),都可以通过__dict__和dir()来显示数据对象的相关属性. __dict__可以看作是数据对象的名称空间,所以只包含自己的属性,且可以直接增.删.改.查__dict__. dir()可以看作是显示属性的包含显示,除了显示自己的还显示继承来的属性. 对于模块 参见:查看模块属性 对于类和对象 以下面的例子解释__dict__和dir()在应用于类和对象上的不同之处. class supcls: def hel

__dict__和dir()的区别

__dict__和dir()的区别 dir() 一般用来查看模块的属性 __dict__从某方面上来说是dir()的子集 可以直接打印dir(),显示的是当前执行文件所有的属性 __dict__ __dict__是对象的属性,有些对象是没有__dict__这个属性的 (list,dict...) zx=[1,2,3,4] zx2={"sa":"sad"} print(dir(zx)) # print(zx2.__dict__) # print(zx.__dict__

[Python] NotImplemented 和 NotImplementedError 区别

NotImplemented 是一个非异常对象,NotImplementedError 是一个异常对象. >>> NotImplemented NotImplemented >>> NotImplementedError <type 'exceptions.NotImplementedError'> >>> type(NotImplemented) <type 'NotImplementedType'> >>>

python中__dict__和dir()

转自:http://www.cnblogs.com/ifantastic/p/3768415.html 首先需要知道的是,dir() 是 Python 提供的一个 API 函数,dir() 函数会自动寻找一个对象的所有属性,包括搜索 __dict__ 中列出的属性. 不是所有的对象都有 __dict__ 属性.例如,如果你在一个类中添加了 __slots__ 属性,那么这个类的实例将不会拥有 __dict__ 属性,但是 dir() 仍然可以找到并列出它的实例所有有效属性. >>> cl

Python中POP()的区别

Python中列表,字典和Set都有pop函数,但参数略有区别如下:以下参数基于Python 3.4.1 1. List 1 >>> help(list.pop) 2 Help on method_descriptor: 3 4 pop(...) 5 L.pop([index]) -> item -- remove and return item at index (default last). 6 Raises IndexError if list is empty or ind

python __dict__

test_\@.py #!/usr/bin/env python2#-*- coding: utf-8 -*- def args(*args, **kwargs): def _decorator(func): print "befor ", func.__dict__ func.__dict__.setdefault('options', []).insert(0, (args, kwargs)) print 'end ', func.__dict__ return func retu

python中@classmethod @staticmethod区别

Python中3种方式定义类方法, 常规方式, @classmethod修饰方式, @staticmethod修饰方式. class A(object): def foo(self, x): print("executing foo(%s,%s)" % (self, x)) print('self:', self) @classmethod def class_foo(cls, x): print("executing class_foo(%s,%s)" % (cl

PyQt的QString和python的string的区别

转载于http://blog.chinaunix.net/uid-200142-id-4018863.html python的string和PyQt的QString的区别 python string和PyQt的QString的区别 以下在Python2.6和PyQt4.4.4 for Python2,6环境下讨论: Python中有两种有关字符的类型:Python string object和Python Unicode object.主要使用Python string object进行数据输入