python類-屬性

來源:互聯網
上載者:User

執行個體屬性和類屬性

理論基礎

類屬性有點類似C++中的靜態變數,可以通過 【類名.屬性 】直接存取

執行個體屬性故名思議就是只有定義了類的執行個體後才可以用的屬性

通過類名不可以訪問執行個體屬性

通過執行個體可以訪問類屬性

如果執行個體屬性給類屬性進行了賦值操作,則會將其覆蓋。

程式碼範例
class SYG(object):    class_var = 1        def __init__(self):        self.instance_var = 2if __name__ == '__main__':    syg = SYG()    #可以通過執行個體來反訪問類屬性    print(syg.class_var)    print(SYG.class_var)    #不可以用類名訪問執行個體變數    #print(SYG.instance_var)    #執行個體屬性會覆蓋類屬性    syg.class_var = 3       print(syg.class_var)    print(SYG.class_var)

執行個體屬性操作重載object方法

如果我們要控制自己類中的執行個體屬性,可以通過重載以下幾個方法來實現特殊功能

★這些方法不能對類屬性進行操作

__getattr__ 訪問在類中未被定義的屬性時會被調用

__setattr__ 設定所有的屬性時被調用

__delattr__ 刪除所有的屬性時被調用

__getattribute__ 訪問所有的屬性時會被調用,這個被重載後。包含__getattr__

程式碼範例:

class SYG(object):    def __init__(self):        self.xx = 0    def __getattr__(self,name):        print("override getattr")        return object.__getattr__(self,name)    def __setattr__(self,name,value):        print("override setattr")        return object.__setattr__(self,name,value)    def __delattr__(self,name):        print('override delattr')        return object.delattr(self,name)    def __getattribute__(self,name):        print('override getattribute')        return object.__getattribute__(self,name)if __name__ == '__main__':    syg = SYG()    syg.test = 3    print(syg.test)    print(syg.ok) #由於存在這個屬性會拋出異常

輸出結果:

override setattr
override getattribute
3
override getattribute
override getattr
Traceback (most recent call last):
  File "temp.py", line 27, in <module>
    print(syg.ok)
  File "temp.py", line 9, in __getattr__
    return object.__getattr__(self,name)
AttributeError: type object 'object' has no attribute '__getattr__'

使用property 一般函數實現
class SYG(object):     def __init__(self):        self._x = 0    def getx(self):        print("getx")        return self._x    def setx(self,value):        print('setx')        self._x = value    def delx(self):        del self._x    #定義自己的set,get,del操作    newx = property(getx, setx, delx)    if __name__ == '__main__':    syg = SYG()    syg.newx = 3    print(syg.newx)

用decorator方法實現

class SYG(object):     def __init__(self):        self._x = 0    @property    def var_x(self):        print('readonly _x')        return self._x    @var_x.setter    def var_x(self,value):        print('setx')        self._x = value            @var_x.deleter    def var_x(self):        del self._xif __name__ == '__main__':    syg = SYG()    syg.var_x = 3    print(syg.var_x)

《本節完》

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.