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

python魔法方法之__setattr__()

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

前言:

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

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.

簡單的說,__setattr__()在屬性賦值時被調用,并且將值存儲到實例字典中,這個字典應該是self的__dict__屬性。即:在類實例的每個屬性進行賦值時,都會首先調用__setattr__()方法,并在__setattr__()方法中將屬性名和屬性值添加到類實例的__dict__屬性中。

1、實例屬性管理__dict__

下面的測試代碼中定義了三個實例屬性,每個實例屬性注冊后都print()此時的__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()

得到的結果顯示出,每次實例屬性賦值時,都會將屬性名和對應值存儲到__dict__字典中:

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

2、__setattr__()與__dict__

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

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__))
? ? ? ? # 屬性注冊
? ? ? ? self.__dict__[key] = value
fun = Fun() ? ?

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

**************************************************
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__()中三個屬性賦值時,每次都會調用一次__setattr__()函數。

3、重載__setattr__()必須謹慎

由于__setattr__()負責在__dict__中對屬性進行注冊,所以自己在重載時必須進行屬性注冊過程,下面是__setattr__()不進行屬性注冊的例子:

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__中并沒有將屬性注冊到__dict__中,所以not_fun對象并沒有name屬性,因此最后的print(not_fun.name)會報出屬性不存在的錯誤:

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__時必須要考慮是否在__dict__中進行屬性注冊。

總結:

python的實例屬性的定義、獲取和管理可以通過__setattr__()和__dict__配合進行,當然還有對應的__getattr__()方法,本文暫時不做分析。__setattr__()方法在類的屬性賦值時被調用,并通常需要把屬性名和屬性值存儲到self的__dict__字典中。

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

相關文章

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

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

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

    Python socket非阻塞模塊應用示例

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

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

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

    教你用Python查看茅臺股票交易數據的詳細代碼

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

    python單鏈路性能測試實踐

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

    Pycharm 跳轉回之前所在頁面的操作

    這篇文章主要介紹了Pycharm 跳轉回之前所在頁面的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • pandas對齊運算的實現示例

    pandas對齊運算的實現示例

    本文主要介紹了pandas對齊運算的實現示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • GitHub上值得推薦的8個python 項目

    GitHub上值得推薦的8個python 項目

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

    深入理解Python中__init__.py文件

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

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

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

最新評論

澄城县| 土默特右旗| 五原县| 呼图壁县| 襄城县| 印江| 兴隆县| 蚌埠市| 封丘县| 仁怀市| 封丘县| 湖南省| 镇江市| 江达县| 宿迁市| 当涂县| 太湖县| 蛟河市| 潮州市| 乃东县| 若尔盖县| 大连市| 民丰县| 昌图县| 海宁市| 蒲江县| 兴宁市| 金堂县| 游戏| 三都| 清水河县| 台南县| 黔西县| 遂溪县| 翁牛特旗| 荥经县| 南康市| 景宁| 雅安市| 温宿县| 扎赉特旗|