在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 三、屬性的訪問控制
二、Enum 的源碼
前言
一、Python 模塊簡介
一、List(列表)
五、匿名函數(shù)
三、什么是元類
二、循環(huán)語句
二、模塊的使用
三、第一個 Python 程序
線程與進程
Python
三、條件語句和循環(huán)語句綜合實例
四、對象的描述器
三、類的屬性
一、迭代
五、迭代器和生成器綜合例子
六、運算符相關(guān)的魔術(shù)方法
一、枚舉類的使用
前言
一、簡明概述
二、Python 的基本數(shù)據(jù)類型
多線程編程
五、作用域
四、包
四、枚舉的比較
四、Python 中的變量
六、類的多態(tài)
一、Python 中類也是對象
一、Python 的 Magic Method
前言
四、生成器
一、面向?qū)ο蟮母拍?/span>
五、類的繼承
二、類
二、使用 <code>type()</code> 動態(tài)創(chuàng)建類
進程
二、set
三、主模塊和非主模塊
一、字典(Dictionary)
前言
前言
前言
前言
四、集成開發(fā)環(huán)境(IDE): PyCharm
前言
四、函數(shù)的參數(shù)
三、lsit 生成式(列表生成式)
四、自定義元類
四、類的方法
二、函數(shù)傳值問題
二、注釋
一、條件語句
一、Python 語法的簡要說明
三、函數(shù)返回值
三、基本數(shù)據(jù)類型轉(zhuǎn)換
三、屬性的訪問控制
二、Python 的安裝
前言
三、命名規(guī)范
一、Python 自定義函數(shù)的基本步驟
三、自定義類型的枚舉
五、自定義容器(Container)
二、Python 迭代器
前言
二、tuple(元組)
一、Python 簡介
前言
前言
前言
二、構(gòu)造(<code>__new__</code>)和初始化(<code>__init__</code>)
前言

三、屬性的訪問控制

之前也有講到過,Python 沒有真正意義上的私有屬性。然后這就導致了對 Python 類的封裝性比較差。我們有時候會希望 Python 能夠定義私有屬性,然后提供公共可訪問的 get 方法和 set 方法。Python 其實可以通過魔術(shù)方法來實現(xiàn)封裝。

方法 說明
__getattr__(self, name) 該方法定義了你試圖訪問一個不存在的屬性時的行為。因此,重載該方法可以實現(xiàn)捕獲錯誤拼寫然后進行重定向, 或者對一些廢棄的屬性進行警告。
__setattr__(self, name, value) 定義了對屬性進行賦值和修改操作時的行為。不管對象的某個屬性是否存在,都允許為該屬性進行賦值.有一點需要注意,實現(xiàn) __setattr__ 時要避免"無限遞歸"的錯誤,
__delattr__(self, name) __delattr____setattr__ 很像,只是它定義的是你刪除屬性時的行為。實現(xiàn) __delattr__ 是同時要避免"無限遞歸"的錯誤
__getattribute__(self, name) __getattribute__ 定義了你的屬性被訪問時的行為,相比較,__getattr__ 只有該屬性不存在時才會起作用。因此,在支持 __getattribute__的 Python 版本,調(diào)用__getattr__ 前必定會調(diào)用 __getattribute__``__getattribute__ 同樣要避免"無限遞歸"的錯誤。

通過上面的方法表可以知道,在進行屬性訪問控制定義的時候你可能會很容易的引起一個錯誤,可以看看下面的示例:

def __setattr__(self, name, value):
    self.name = value
    # 每當屬性被賦值的時候, ``__setattr__()`` 會被調(diào)用,這樣就造成了遞歸調(diào)用。
    # 這意味這會調(diào)用 ``self.__setattr__('name', value)`` ,每次方法會調(diào)用自己。這樣會造成程序崩潰。

def __setattr__(self, name, value):
    # 給類中的屬性名分配值
    self.__dict__[name] = value  
    # 定制特有屬性

上面方法的調(diào)用具體示例如下:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

class User(object):
    def __getattr__(self, name):
        print('調(diào)用了 __getattr__ 方法')
        return super(User, self).__getattr__(name)

    def __setattr__(self, name, value):
        print('調(diào)用了 __setattr__ 方法')
        return super(User, self).__setattr__(name, value)

    def __delattr__(self, name):
        print('調(diào)用了 __delattr__ 方法')
        return super(User, self).__delattr__(name)

    def __getattribute__(self, name):
        print('調(diào)用了 __getattribute__ 方法')
        return super(User, self).__getattribute__(name)

if __name__ == '__main__':
    user = User()
    # 設(shè)置屬性值,會調(diào)用 __setattr__
    user.attr1 = True
    # 屬性存在,只有__getattribute__調(diào)用
    user.attr1
    try:
        # 屬性不存在, 先調(diào)用__getattribute__, 后調(diào)用__getattr__
        user.attr2
    except AttributeError:
        pass
    # __delattr__調(diào)用
    del user.attr1

輸出的結(jié)果:

調(diào)用了 __setattr__ 方法
調(diào)用了 __getattribute__ 方法
調(diào)用了 __getattribute__ 方法
調(diào)用了 __getattr__ 方法
調(diào)用了 __delattr__ 方法