Метод Setattr не вызывается при добавлении в список - PullRequest
2 голосов
/ 10 июля 2020

Почему при добавлении или объединении списка атрибутов объекта или словаря __setattr__ метод не вызывается. Описание методов «Вызывается при попытке присвоения атрибута». заставит меня поверить, что объединение двух списков будет работать, но метод __setattr__ все еще не вызывается.

class objVal(object):
    def __init__(self):
        self.articles = {'testkeyword': [1,2,3], 'testkeyword1': [4,5,6]}
    def __setattr__(self, key, value):
        super(objVal, self).__setattr__(key, value)
        print('setattr: ' + str(key) + '=' + str(value))

test = objVal()

templist = [11,12,13]
keyword = 'testkeyword'

test.articles[keyword] = test.articles[keyword] + templist # Does not trigger setattr
for item in templist: 
    test.articles[keyword].append(item) # Does not trigger setattr

print(test.articles[keyword])

1 Ответ

2 голосов
/ 10 июля 2020

__setattr__() вызывается, когда используется следующий синтаксис:

obj.key = value
# obj.__setattr__('key', value)

Обратите внимание, что вызов метода (например, вызов .append()) не активирует это, потому что вы ' re ничего напрямую не устанавливает. (получение метода append вызовет запуск __getattr__()).

В большинстве случаев, если вы разработали класс, вы все равно вызовете __setattr__() в какой-то момент по строке - но для в большинстве встроенных классов функциональность абстрагирована, обрабатывается с помощью макроса или чего-то еще, что «пропускает» шаг __setattr__().

Обратите внимание, что метод __setitem__() также существует для некоторых объектов (не для всех!) И отличается от __setattr__(), потому что он вызывается другим синтаксисом:

obj[key] = value
# obj.__setitem__('key', value)

но, насколько далеко как я помню, вызов .append() в списке обычно не вызывает и этого, хотя это может зависеть от того, какую реализацию python вы используете. Это происходит по указанной выше причине - интерпретатор использует ярлыки для выполнения работы для некоторых из основных встроенных классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...