__slots__和@property

__slots__,封裝屬性

__slots__常見的的用法是用來封裝屬性,限制對實例胡亂添加屬性。然而他還有一個重要的作用是可以減少內(nèi)存使用。
當(dāng)定義了__slots__屬性時,Python就會針對實例采用一種更加緊湊的內(nèi)部表示。不在讓每個實例都創(chuàng)建一個__dict__字典,現(xiàn)在的實例是圍繞著一個固定長度的小型數(shù)組來構(gòu)建的,這和一個元組或者列表很相似。在__slots__中列出的屬性名會在內(nèi)部映射到這個數(shù)組的特定索引上。使用__slots__所帶來的副作用是我們沒法在對實例添加任何新的屬性了——我們被限制在只允許使用__slots__中列出的那些屬性名。

class Date(object):
    __slots__ = ['year', 'month', 'day']

    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

d = Date('2017', '11', '21')
print(d.year+'-'+d.month+'-'+d.day)
#輸出
2017-11-21

#設(shè)置屬性hour
d.hour = '19'
#報錯
AttributeError: 'Date' object has no attribute 'hour'

@property,創(chuàng)建可管理的屬性

在對實例屬性的獲取和設(shè)定上,如果希望能夠增加一些額外的處理過程(如類型檢查或者驗證),一種簡單的方式是將其定義為property(也即把類中定義的函數(shù)當(dāng)做一種屬性來使用)。

class A(object):

    def __init__(self, name):
        self.name = name

    # 將name定義為property屬性,此處增加了增加了對name屬性的修飾
    @property
    def name(self):
        return 'my name is: ' + self._name

    # 將可選方法setter綁定到name屬性上,設(shè)定屬性時做類型檢查
    @name.setter
    def name(self, value):
        if not isinstance(value, str):
            raise TypeError('Expect a string')
        self._name = value

    # 將可選方法deleter綁定到name屬性上,此處設(shè)置為屬性不可刪除
    @name.deleter
    def name(self):
        raise AttributeError('Cannot delet attribute!')

a = A('a')
a.name = 'shexuan'
print(a.name)
#輸出
my name is: shexuan

#設(shè)置name屬性為int(10)
a.name = 10
#報錯
TypeError: Expect a string
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,099評論 25 709
  • 我獨(dú)自走在鄉(xiāng)間的小道上,去尋找祖父母口中的那袋舊物,那究竟是什么東西承載了怎樣的回憶能讓老人們念念不忘?我靠著零碎...
    清丞Liuli閱讀 265評論 0 0
  • 我是屬于那種特別浮躁的人,做點(diǎn)事情靜不下心來,沒有那種‘沉著’的勇氣。自己也知道,這是我的一大缺點(diǎn),然而想改總是那...
    夏以喬木閱讀 366評論 0 1
  • 首先說一下我的ReactNative的版本是0.43.4,Android6.0(華為榮耀6Plus),以下遇到的坑...
    Dony閱讀 2,114評論 0 3

友情鏈接更多精彩內(nèi)容