最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python魔法方法之__setattr__()

 更新時(shí)間:2022年03月10日 11:32:37   作者:機(jī)器學(xué)習(xí)入坑者  
這篇文章主要介紹了python魔法方法之__setattr__(),python提供了諸多的魔法方法,其中__setattr__()方法主要用于類實(shí)例進(jìn)行屬性賦值,接下來(lái)請(qǐng)和小編一起進(jìn)入文章來(lái)了解更多相關(guān)內(nèi)容吧

前言:

python提供了諸多的魔法方法,其中__setattr__()方法主要用于類實(shí)例進(jìn)行屬性賦值,其定義在Object類官方提供的說(shuō)明如下:

Called when an attribute assignment is attempted. 
This is called instead of the normal mechanism (i.e. store the value in the instance dictionary).
 name is the attribute name, value is the value to be assigned to it.

簡(jiǎn)單的說(shuō),__setattr__()在屬性賦值時(shí)被調(diào)用,并且將值存儲(chǔ)到實(shí)例字典中,這個(gè)字典應(yīng)該是self的__dict__屬性。即:在類實(shí)例的每個(gè)屬性進(jìn)行賦值時(shí),都會(huì)首先調(diào)用__setattr__()方法,并在__setattr__()方法中將屬性名和屬性值添加到類實(shí)例的__dict__屬性中。

1、實(shí)例屬性管理__dict__

下面的測(cè)試代碼中定義了三個(gè)實(shí)例屬性,每個(gè)實(shí)例屬性注冊(cè)后都print()此時(shí)的__dict__,

代碼如下:

class AnotherFun:
? ? def __init__(self):
? ? ? ? self.name = "Liu"
? ? ? ? print(self.__dict__)
? ? ? ? self.age = 12
? ? ? ? print(self.__dict__)
? ? ? ? self.male = True
? ? ? ? print(self.__dict__)
another_fun = AnotherFun()

得到的結(jié)果顯示出,每次實(shí)例屬性賦值時(shí),都會(huì)將屬性名和對(duì)應(yīng)值存儲(chǔ)到__dict__字典中:

{'name': 'Liu'}
{'name': 'Liu', 'age': 12}
{'name': 'Liu', 'age': 12, 'male': True}

2、__setattr__()與__dict__

由于每次類實(shí)例進(jìn)行屬性賦值時(shí)都會(huì)調(diào)用__setattr__(),所以可以重載__setattr__()方法,來(lái)動(dòng)態(tài)的觀察每次實(shí)例屬性賦值時(shí)__dict__()的變化。下面的Fun類重載了__setattr__()方法,并且將實(shí)例的屬性和屬性值作為__dict__的鍵-值對(duì):

class Fun:
? ? def __init__(self):
? ? ? ? self.name = "Liu"
? ? ? ? self.age = 12
? ? ? ? self.male = True
? ? ? ??
? ? def __setattr__(self, key, value):
? ? ? ? print("*"*50)
? ? ? ? print("setting:{}, ?with:{}".format(key[], value))
? ? ? ? print("current __dict__ : {}".format(self.__dict__))
? ? ? ? # 屬性注冊(cè)
? ? ? ? self.__dict__[key] = value
fun = Fun() ? ?

通過(guò)在__setattr__()中將屬性名作為key,并將屬性值作為value,添加到了__dict__中,得到的結(jié)果如下:

**************************************************
setting:name,  with:Liu
current __dict__ : {}
**************************************************
setting:age,  with:12
current __dict__ : {'name': 'Liu'}
**************************************************
setting:male,  with:True
current __dict__ : {'name': 'Liu', 'age': 12}

可以看出,__init__()中三個(gè)屬性賦值時(shí),每次都會(huì)調(diào)用一次__setattr__()函數(shù)。

3、重載__setattr__()必須謹(jǐn)慎

由于__setattr__()負(fù)責(zé)在__dict__中對(duì)屬性進(jìn)行注冊(cè),所以自己在重載時(shí)必須進(jìn)行屬性注冊(cè)過(guò)程,下面是__setattr__()不進(jìn)行屬性注冊(cè)的例子:

class NotFun:
? ? def __init__(self):
? ? ? ? self.name = "Liu"
? ? ? ? self.age = 12
? ? ? ? self.male = True
? ??
? ? def __setattr__(self, key, value):
? ? ? ? pass
not_fun = NotFun()
print(not_fun.name)

由于__setattr__中并沒(méi)有將屬性注冊(cè)到__dict__中,所以not_fun對(duì)象并沒(méi)有name屬性,因此最后的print(not_fun.name)會(huì)報(bào)出屬性不存在的錯(cuò)誤:

AttributeError                            Traceback (most recent call last)
<ipython-input-21-6158d7aaef71> in <module>()
      8         pass
      9 not_fun = NotFun()
---> 10 print(not_fun.name)

AttributeError: 'NotFun' object has no attribute 'name'

所以,重載__setattr__時(shí)必須要考慮是否在__dict__中進(jìn)行屬性注冊(cè)。

總結(jié):

python的實(shí)例屬性的定義、獲取和管理可以通過(guò)__setattr__()和__dict__配合進(jìn)行,當(dāng)然還有對(duì)應(yīng)的__getattr__()方法,本文暫時(shí)不做分析。__setattr__()方法在類的屬性賦值時(shí)被調(diào)用,并通常需要把屬性名和屬性值存儲(chǔ)到self的__dict__字典中。

到此這篇關(guān)于python魔法方法之__setattr__()的文章就介紹到這了,更多相關(guān)python魔法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一行代碼生成Tableau可視化圖表的方法

    一行代碼生成Tableau可視化圖表的方法

    本文主要介紹了一行代碼生成Tableau可視化圖表的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Python socket非阻塞模塊應(yīng)用示例

    Python socket非阻塞模塊應(yīng)用示例

    這篇文章主要介紹了Python socket非阻塞模塊,結(jié)合實(shí)例形式分析了Python socket非阻塞模塊通信相關(guān)操作技巧,需要的朋友可以參考下
    2019-09-09
  • python 視頻下載神器(you-get)的具體使用

    python 視頻下載神器(you-get)的具體使用

    這篇文章主要介紹了python 視頻下載神器(you-get)的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 教你用Python查看茅臺(tái)股票交易數(shù)據(jù)的詳細(xì)代碼

    教你用Python查看茅臺(tái)股票交易數(shù)據(jù)的詳細(xì)代碼

    CSV是以逗號(hào)分隔數(shù)據(jù)項(xiàng)(也被稱為字段)的數(shù)據(jù)交換格式,主要應(yīng)用于電子表格和數(shù)據(jù)庫(kù)之間的數(shù)據(jù)交換,本文給大家介紹下用Python查看茅臺(tái)股票交易數(shù)據(jù)的詳細(xì)代碼,感興趣的朋友一起看看吧
    2022-03-03
  • python單鏈路性能測(cè)試實(shí)踐

    python單鏈路性能測(cè)試實(shí)踐

    這篇文章主要為大家介紹了python單鏈路性能測(cè)試實(shí)踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Pycharm 跳轉(zhuǎn)回之前所在頁(yè)面的操作

    Pycharm 跳轉(zhuǎn)回之前所在頁(yè)面的操作

    這篇文章主要介紹了Pycharm 跳轉(zhuǎn)回之前所在頁(yè)面的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • pandas對(duì)齊運(yùn)算的實(shí)現(xiàn)示例

    pandas對(duì)齊運(yùn)算的實(shí)現(xiàn)示例

    本文主要介紹了pandas對(duì)齊運(yùn)算的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • GitHub上值得推薦的8個(gè)python 項(xiàng)目

    GitHub上值得推薦的8個(gè)python 項(xiàng)目

    GitHub 無(wú)疑是代碼托管領(lǐng)域的先行者,Python 作為一種通用編程語(yǔ)言,已經(jīng)被千千萬(wàn)萬(wàn)的開發(fā)人員用來(lái)構(gòu)建各種有意思或有用的項(xiàng)目。以下我們會(huì)介紹一些使用 Python 構(gòu)建的GitHub上優(yōu)秀的項(xiàng)目。
    2020-10-10
  • 深入理解Python中__init__.py文件

    深入理解Python中__init__.py文件

    本文主要介紹了深入理解Python中__init__.py文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • python游戲開發(fā)的五個(gè)案例分享

    python游戲開發(fā)的五個(gè)案例分享

    本文給大家分享了作者整理的五個(gè)python游戲開發(fā)的案例,通過(guò)具體設(shè)計(jì)思路,代碼等方面詳細(xì)了解python游戲開發(fā)的過(guò)程,非常的詳細(xì),希望大家能夠喜歡
    2020-03-03

最新評(píng)論

宁陵县| 阿城市| 望都县| 沧州市| 永靖县| 社旗县| 潜江市| 英超| 汕头市| 交城县| 上虞市| 淳安县| 绵竹市| 宜兰县| 卢湾区| 门头沟区| 麟游县| 台北市| 夹江县| 天津市| 柳江县| 荔波县| 朝阳县| 阿城市| 汉川市| 都昌县| 华坪县| 门头沟区| 鸡西市| 修水县| 襄樊市| 诏安县| 二手房| 宁晋县| 怀宁县| 开江县| 吉水县| 金门县| 连云港市| 湖口县| 大田县|