zoukankan      html  css  js  c++  java
  • __dict__属性详解

    1.类的__dict__属性和类对象的__dict__属性

    class Parent(object):
        a = 'a'
        b = 1
    
        def __init__(self):
            self.a = 'A'
            self.b = 1.1
    
        def print_info(self):
            print('a = %s , b = %s' % (self.a, self.b))
    
        @staticmethod
        def static_test(self):
            print
            'a static func.'
    
        @classmethod
        def class_test(self):
            print
            'a calss func.'
    
    
    # class Son(Parent):
    
    p = Parent()
    print(Parent.__dict__)
    print(p.__dict__)

    运行结果如下:

    {'__module__': '__main__', 'a': 'a', 'b': 1, '__init__': <function Parent.__init__ at 0x0000000002168950>, 'print_info': <function Parent.print_info at 0x00000000021689D8>, 'static_test': <staticmethod object at 0x00000000021677B8>, 'class_test': <classmethod object at 0x0000000002167DD8>, '__dict__': <attribute '__dict__' of 'Parent' objects>, '__weakref__': <attribute '__weakref__' of 'Parent' objects>, '__doc__': None}
    {
    'a': 'A', 'b': 1.1}

    由此可见, 类的静态函数、类函数、普通函数、全局变量以及一些内置的属性都是放在类__dict__里的

      对象的__dict__中存储了一些self.xxx的一些东西

    2.存在继承关系的

      子类有自己的__dict__, 父类也有自己的__dict__,子类的全局变量和函数放在子类的dict中,父类的放在父类dict中。

      

    class Parent(object):
        a = 'a'
        b = 1
    
        def __init__(self):
            self.a = 'A'
            self.b = 1.1
    
    
    class Son(Parent):
        a = 'b'
        b = 2
    
        def __init__(self):
            self.b = 2.2
            self.a = 'B'
    
    
    p = Parent()
    print(Parent.__dict__)
    print(p.__dict__)
    s = Son()
    print(Son.__dict__)
    print(s.__dict__)

     运行上面的代码,结果入下: 

        

    {'__module__': '__main__', 'a': 'a', 'b': 1, '__init__': <function Parent.__init__ at 0x0000000002278950>, '__dict__': <attribute '__dict__' of 'Parent' objects>, '__weakref__': <attribute '__weakref__' of 'Parent' objects>, '__doc__': None}
    {'a': 'A', 'b': 1.1}
    {'__module__': '__main__', 'a': 'b', 'b': 2, '__init__': <function Son.__init__ at 0x00000000022789D8>, '__doc__': None}
    {'b': 2.2, 'a': 'B'}

      

     再看内置的数据类型, 类 == 类型,但内置数据是没有__dict__属性

     

    num = 3
    ll = []
    dd = {}

    运行结果:

      

    Traceback (most recent call last):
      File "D:/python_studay/day8/__dict__属性详解.py", line 31, in <module>
        num.__dict__
    AttributeError: 'int' object has no attribute '__dict__'

    总结:

      1.内置的数据类型是没有__dict__属性

      2.类的__dict__存放类这个名称空间里有的数据,但类实例化的对象__dict__属性只存放对象的名称空间的数据。比如self.xx

      3.类存在继承关系,父类的__dict__ 并不会影响子类的__dict__

  • 相关阅读:
    Android消息推送完美方案[转]
    这一路走来
    【深入比较ThreadLocal模式与synchronized关键字】
    前端闭包 解决异步执行问题
    微信小程序在wxml双大括号中执行复杂运算
    腾讯云对象存储使用
    CSS中的flex布局
    docker基础学习笔记
    redis学习笔记
    微信小程序页面栈管理
  • 原文地址:https://www.cnblogs.com/linbin7/p/11121509.html
Copyright © 2011-2022 走看看