1. 程式人生 > >python __getattr__ 和 __setattr__方法

python __getattr__ 和 __setattr__方法

1、__getattr__ 

攔截點號運算。當對未定義的屬性名稱和例項進行點號運算時,就會用屬性名作為字串呼叫這個方法。如果繼承樹可以找到該屬性,則不呼叫此方法

例:當調x.age的時候,不會走到__getattr__ 方法。調x.name的時候(此時demo的__init__方法沒有定義name屬性),此時會調__getattr__方法。


class demo:
    def __init__(self):
        self.name = 'dd'

    def __getattr__(self, attrname):
        if attrname =="age":
            return 40
        else:
            raise(attrname)

x = demo()
print(x.age)
print(x.name)

2、__setattr__

例:會攔截所有屬性的的賦值語句。當在__setattr__方法內對屬性進行賦值是,不可使用self.attr = value,因為他會再次呼叫self,__setattr__("attr", value),則會形成無窮遞迴迴圈,最後導致堆疊溢位異常。應該通過對屬性字典做索引運算來賦值任何例項屬性,也就是使用self.__dict__['name'] = value.

class demo:
    def __setattr__(self, attrname, value):
        if attrname == "ddd":
            self.__dict__[attrname] = value
        else:
            print("ggg")



x = demo()
x.ddd = "xxx"
print(x.ddd)


output:xxx