1. 程式人生 > >Python3 魔法方法:屬性訪問

Python3 魔法方法:屬性訪問

獲取 attr super() 父類 有關 self val color def

1、與屬性訪問有關的魔法方法

__getattr__(self,name)

定義當用戶試圖獲取某一不存在的屬性時的行為

__getattribute__(self,name)

定義當該類屬性被訪問時的行為

__setattr__(self,name,value)

定義一個屬性被設置時的行為

__delattr__(self,name)

定義一個屬性被刪除時的行為

註意:

def __setattr__(self, name, value):
        self.name = value + 1

#此代碼試圖在對對象的屬性進行賦值時讓屬性的值加1但是
self.name = value + 1這句又會觸發 __setattr__從而導致無限遞歸

正確寫法:

def __setattr__(self, name, value):
        super().__setattr__(name,value+1)
#尋找父類的__setattr__方法來對屬性name賦值

或者:

def __setattr__(self, name, value):
        self.__dict__[name] = value + 1

以下的代碼問題:

class Counter:
        def __init__(self):
                self.counter = 0 #
這裏會觸發 __setattr__ 調用 def __setattr__(self, name, value): self.counter += 1 “””既然需要 __setattr__ 調用後才能真正設置 self.counter 的值,所以這時候 self.counter 還沒有定義,所以沒法 += 1,錯誤的根源。””” super().__setattr__(name, value) def __delattr__
(self, name): self.counter -= 1 super().__delattr__(name)

定義一個count類實現檢測屬性的增減

class Counter:
    def __init__(self):
        self.counter = 0
    def __setattr__(self, name, value):
        if name== counter:
            super().__setattr__(name, value)
        else:
            self.counter += 1
            super().__setattr__(name, value)
    def __delattr__(self, name):
        if name ==counter:
            super().__delattr__(name)
        else:
            self.counter -= 1
            super().__delattr__(name)
class Counter:
        def __init__(self):
                super().__setattr__(counter, 0)
        def __setattr__(self, name, value):
                super().__setattr__(counter, self.counter + 1)
                super().__setattr__(name, value)
        def __delattr__(self, name):
                super().__setattr__(counter, self.counter - 1)
                super().__delattr__(name)

Python3 魔法方法:屬性訪問