在Python中一些皆为对象,__dict__属性中保存了对象所有可写的属性及其对应值的字典。
本文主要介绍类和对象、父类和子类的__dict__有什么区别。
1. 类和对象__dict__
定义类和对象如下:
# 类
class Sample(object):
a = 1
b = 2
def __init__ (self):
self.name = 'abc'
self.a = 3
def test(self):
pass
def _test(self):
pass
def __test(self):
pass
@staticmethod
def static_test(self):
pass
@classmethod
def class_test(self):
pass
# 对象
sample1 = Sample()
分别打印类和对象的__dict__输出如下:
# 类
print(Sample.__dict__)
# 结果↓
'__module__': '__main__', 'a': 1, 'b': 2, '__init__': <function Sample.__init__ at 0x7fdda287a680>, 'test': <function Sample.test at 0x7fdda287a7a0>, '_test': <function Sample._test at 0x7fdda287ac20>, '_Sample__test': <function Sample.__test at 0x7fdda287a290>, 'static_test': <staticmethod object at 0x7fdda277f510>, 'class_test': <classmethod object at 0x7fdda277f890>, '__dict__': <attribute '__dict__' of 'Sample' objects>, '__weakref__': <attribute '__weakref__' of 'Sample' objects>, '__doc__': None}
# 对象
print(sample1.__dict__)
# 结果↓
{'name': 'abc', 'a': 3}
从中可以得到几个观察:
- 类的__dict__中包含了类变量、在类中定义的所有方法。而实例变量不包含在内。需要注意的一点是,私有函数(以双下划线开头的函数)被改写成了_类名+函数名的形式
- 对象的__dict__中包含里实例变量(即以self开头的变量)。
2. 父类和子类__dict__
# Sample类的子类
class Sample_Child(Sample):
a = 4
def __init__(self):
self.name = 'abc_child'
def test(self):
pass
子类的类__dict__和对象__dict__:
# 子类 __dict__
print(Sample_Child.__dict__)
# 结果↓
{'__module__': '__main__', 'a': 4, '__init__': <function Sample_Child.__init__ at 0x7fdda2895f80>, 'test': <function Sample_Child.test at 0x7fdda2797b90>, '__doc__': None}
# 子类对象 __dict__
print(Sample_Child().__dict__)
# 结果
{'name': 'abc_child'}
得到的观察:
- 子类的__dict__中不包含父类__dict__的元素
- 子类的对象__dict__也不包含父类对象的__dict__
3. 总结
- 类的__dict__中包含了类变量、在类中定义的所有方法。而实例变量不包含在内。
- 对象的__dict__中包含里实例变量(即以self开头的变量)。不包含类变量。
- 子类的__dict__中不包含父类__dict__的元素。
- 子类对象__dict__也不包含父类对象的__dict__。