1. 程式人生 > >__getattr__、__setattr__、__delattr__、__getattrbute__方法個人理解

__getattr__、__setattr__、__delattr__、__getattrbute__方法個人理解

通過 本質 attr_ foo IT recursion IV dep 實現

################ 所有方法參考 __setattr__() ######################

類中:

__getattr__ () # 在調用不存在的屬性時默認會調用

__setattr__() # 設置新的屬性時會調用,就是通過此方法,將你設置的屬性添加到了__dict__中。

如果類中定義了該方法,則設置屬性時執行該方法,但是設置的屬性沒有添加到__dict__中

如果類中又定義了該方法,方法中也設置了屬性,就會進入無限遞歸,

所以可以通過__dict__()來操作

例如:

# 一
class Foo(object):
    def __init__(self, name, id):
        self.name = name
        self.id = id

    def eat(self):

        print("%s " % self.name)

    def __setattr__(self, k, v):
        print(‘hehheeeeeeeeeeeeeeeeee‘)

f1 = Foo(‘he‘, 12) # 設置屬性,因為類中有了__setattr__,所以設置屬性時會執行,
print(f1.__dict__) # 設置的屬性並沒有添加到__dict__中, 方法中並沒有實現設置屬性的功能
>>>
hehheeeeeeeeeeeeeeeeee
hehheeeeeeeeeeeeeeeeee
{}

# 二
class Foo(object):
    def __init__(self, name, id):
        self.name = name
        self.id = id

    def eat(self):

        print("%s " % self.name)

    def __setattr__(self, k, v):
        print(‘hehheeeeeeeeeeeeeeeeee‘)
        self.k = v # 再次處罰 __setattr__() 進入死遞歸
f1 = Foo(‘he‘, 12)
print(f1.__dict__)
>>>
RecursionError: maximum recursion depth exceeded # 死遞歸錯誤

# 三
class Foo(object):
    def __init__(self, name, id):
        self.name = name
        self.id = id

    def eat(self):

        print("%s " % self.name)

    def __setattr__(self, k, v):
        print(‘hehheeeeeeeeeeeeeeeeee‘)
        self.__dict__[k] = v # 只能通過此方式設置,底層也是這麽做的,設置屬性的本質

f1 = Foo(‘he‘, 12)
print(f1.__dict__)
>>>
hehheeeeeeeeeeeeeeeeee
hehheeeeeeeeeeeeeeeeee
{‘name‘: ‘he‘, ‘id‘: 12}
# 其他方法類似

  

__delattr__ () # 刪除屬性時,會調用

__getattrbute__() #

__getattr__、__setattr__、__delattr__、__getattrbute__方法個人理解