好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

python中的__dict__属性介绍

将字典转换成对象的小技巧:

bokeyuan = {"b": 1,
? ? ? ? ? ? ? ? "o": 2,
? ? ? ? ? ? ? ? "k": 3,
? ? ? ? ? ? ? ? "e": 4,
? ? ? ? ? ? ? ? "y": 5,
? ? ? ? ? ? ? ? "u": 6,
? ? ? ? ? ? ? ? "a": 7,
? ? ? ? ? ? ? ? "n": 8,
? ? ? ? ? ? ? ? }
?
class Dict2Obj:
?
? ? # def __init__(self, bokeyuan):
? ? # ? ? self.b = bokeyuan['b']
? ? # ? ? self.o = bokeyuan['o']
? ? # ? ? self.k = bokeyuan['k']
? ? # ? ? self.e = bokeyuan['e']
? ? # ? ? self.y = bokeyuan['y']
? ? # ? ? self.u = bokeyuan['u']
? ? # ? ? self.a = bokeyuan['a']
? ? # ? ? self.n = bokeyuan['n']
?
? ? def __init__(self, bokeyuan):
? ? ? ? print("修改前:", self.__dict__)
? ? ? ? self.__dict__.update(bokeyuan)
? ? ? ? print("修改后:", self.__dict__)
?
d = Dict2Obj(bokeyuan)
print(d)

D:\MC\venv\Scripts\python.exe D:/MC/test03.py
修改前: {}
修改后: {'b': 1, 'o': 2, 'k': 3, 'e': 4, 'y': 5, 'u': 6, 'a': 7, 'n': 8}
<__main__.Dict2Obj object at 0x0000019722B78400>
?
Process finished with exit code 0

Python的实例有自己的 __dict__ 属性,它对应的类也有自己的 __dict__   (但是有些特殊的对象是没有 __dict__ 属性的,这里不做讨论),, __dict__ 是一个字典,键是属性名,值为属性值。

 上面self实例对象的属性首先是{},更新后变为 {'b': 1, 'o': 2, 'k': 3, 'e': 4, 'y': 5, 'u': 6, 'a': 7, 'n': 8}

#首先创建一个类cls,这个类中包含一个值为1的类变量clsvar,一个值为2的实例变量insvar,
class cls:
? ? clsvar = 1
? ? def __init__(self):
? ? ? ? self.insvar = 2
?
#创建类的实例ins1和ins2ins1 = cls()
ins2 = cls()
?
print(cls.__dict__) #类的__dict__属性
print(ins1.__dict__) # 实例对象ins1的__dict__属性
?
ins1.clsvar=20
print(cls.clsvar)
print(ins1.clsvar)
print(ins2.clsvar) # ins1实例改变类变量不会影响ins2实例
print(cls.__dict__) #类的__dict__属性
print(ins1.__dict__) # 实例对象ins1的__dict__属性

D:\MC\venv\Scripts\python.exe D:/MC/test03.py
{'__module__': '__main__', 'clsvar': 1, '__init__': <function cls.__init__ at 0x00000156AEC75040>, '__dict__': <attribute '__dict__' of 'cls' objects>, '__weakref__': <attribute '__weakref__' of 'cls' objects>, '__doc__': None}
{'insvar': 2}
1201
{'__module__': '__main__', 'clsvar': 1, '__init__': <function cls.__init__ at 0x00000156AEC75040>, '__dict__': <attribute '__dict__' of 'cls' objects>, '__weakref__': <attribute '__weakref__' of 'cls' objects>, '__doc__': None}
{'insvar': 2, 'clsvar': 20}
?
Process finished with exit code 0

当打印类的 __dict__ 属性时,列出了类cls所包含的属性,包括一些类内置属性和类变量clsvar以及构造方法__init__

而实例变量则包含在实例对象ins1的__dict__属性中,一个对象的属性查找 顺序 遵循首先查找实例对象自己,然后是类,接着是类的父类。当ins1在自己的 __dict__ 中查找到了clsvar,就不会再向上查找

ins1.clsvar = 20 这句只是在实例ins1的__dict__属性中增加了'clsvar': 20这一键值对,而类中的clsvar的值并没有改变,重要的事情说三遍:一个对象的属性查找顺序遵循首先查找实例对象自己,然后是类,接着是类的父类。当ins1在自己的__dict__中查找到了clsvar,就不会再向上查找,所以输出了值20。但是此时,cls类中的clsvar的值仍然为1。 

到此这篇关于python中的__dict__属性介绍的文章就介绍到这了,更多相关python dict 属性 内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

查看更多关于python中的__dict__属性介绍的详细内容...

  阅读:39次