Jeśli chcę ustawić atrybut na instancję:

Mogę użyć __setattr__(key, value) lub self.__dict__[key]=value

Chcę wiedzieć, jak działa __setattr__, jeśli __setattr__ po prostu ustaw k, v w {x2}}, co jest różniące między dwoma sposobami? Jakie jest znaczenie istnienia Setattr?

4
Wynter 21 kwiecień 2021, 07:48

2 odpowiedzi

Najlepsza odpowiedź

__setattr__(key, value) jest funkcją, która zostanie wywołana przez setattr(instance, key, value).

__setattr__(key, value) zazwyczaj działają tak samo jak self.__dict__[key]= value, chyba że klasa Metoda __setattr__ w funkcji została w jakiś sposób nadpisana.

Może to pomóc Docs

3
Jean-François Fabre 21 kwiecień 2021, 05:06

Podczas gdy __dict__ jest słownikiem wewnętrznym, który posiada wszystkie ich zmienne wewnętrzne, __setattr__ jest właściwie metodą, która jest zawsze wywoływana, gdy próbujesz ustawić atrybut, a zatem można przechwycić te działania i działać zgodnie .

Przykładowy kod może pomóc zrozumieć różnicę:

class Foo:
    def __setattr__(self, key, value):
        print(f'Setting {key} to {value}')
        self.__dict__[key] = value

f = Foo()
f.__dict__['test'] = 1
f.__setattr__('test', 2)
f.test = 3

Wynik byłby następujący:

Setting test to 2
Setting test to 3

A powodem jest uzyskanie dostępu do __dict__, bezpośrednio uzyskujesz dostęp do wewnętrznego stylu obiektu, a metoda __setattr__ jest pomijana.

4
rorra 21 kwiecień 2021, 05:02