为什么要讲 __dict__
- 在Python类的内部,无论是类属性、实例属性、实例方法、类方法、静态方法,都是以字典的形式进行存储的,其中属性名作为键,而值作为该键对应的值
- 为了方便查看类包含了哪些属性、方法,就可以使用类提供的 __dict__ 属性,记住是一个属性,不是方法来的
单继承的栗子
class PoloBlog:sum = 0def __init__(self, name):self.name = namedef test(self):pass@classmethoddef test_cls(cls):pass@staticmethoddef test_static():passblog = PoloBlog(\"小菠萝\")blog.test()# 实例对象调用print(blog.__dict__)# 类对象调用print(PoloBlog.__dict__)# 输出结果{\'name\': \'小菠萝\'}{\'__module__\': \'__main__\', \'sum\': 0, \'__init__\': <function PoloBlog.__init__ at 0x105d2b0d0>, \'test\': <function PoloBlog.test at 0x105d4d310>, \'test_cls\': <classmethod object at 0x105c47fa0>, \'test_static\': <staticmethod object at 0x105c47d90>, \'__dict__\': <attribute \'__dict__\' of \'PoloBlog\' objects>, \'__weakref__\': <attribute \'__weakref__\' of \'PoloBlog\' objects>, \'__doc__\': None}
- 如果用实例对象调用 __dict__ 会输出所有实例属性组成的字典
- 用类对象调用 __dict__ 会输出所有实例方法、类属性、类方法组成的字典
多继承的栗子
class A:a = 0def __init__(self):self.name = \"小菠萝\"passdef test(self):passclass B(A):b = 0def __init__(self):super(B, self).__init__()self.age = 24# 通过类对象调用print(A.__dict__)print(B.__dict__)# 通过实例对象调用a = A()b = B()print(a.__dict__)print(b.__dict__)# 输出结果{\'__module__\': \'__main__\', \'a\': 0, \'__init__\': <function A.__init__ at 0x1022553a0>, \'test\': <function A.test at 0x102255430>, \'__dict__\': <attribute \'__dict__\' of \'A\' objects>, \'__weakref__\': <attribute \'__weakref__\' of \'A\' objects>, \'__doc__\': None}{\'__module__\': \'__main__\', \'b\': 0, \'__init__\': <function B.__init__ at 0x1022554c0>, \'__doc__\': None}{\'name\': \'小菠萝\'}{\'name\': \'小菠萝\', \'age\': 24}
父类有自己的 __dict__,同样子类也有自己的 __dict__,它不会包含父类的 __dict__
通过 __dict__ 修改值
还是上面的代码
a = A()print(a.__dict__)# 修改属性值a.__dict__[\"name\"] = \"新的小菠萝\"print(a.__dict__)# 输出结果{\'name\': \'小菠萝\'}{\'name\': \'新的小菠萝\'}