日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

python中的__dict__屬性介紹_python

作者:公子清羽 ? 更新時間: 2022-06-24 編程語言

將字典轉換成對象的小技巧:

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。?

原文鏈接:https://blog.csdn.net/weixin_42550871/article/details/124386435

欄目分類
最近更新