Вызвать Python __getattr__ и ввести бесконечную рекурсию, даже если атрибут не пропущен - PullRequest
1 голос
/ 07 июня 2019

Я определяю класс NE_Conv2d и переопределяю его __getattr__. Когда я пытаюсь получить существующий атрибут из одного экземпляра этого класса, вызывается __getattr__ и вводится бесконечная рекурсия.

Я знаю, что нужно тщательно обращаться с __getattr__, чтобы избежать бесконечной рекурсии, но, очевидно, атрибут conv уже существует после вызова __init__. Поэтому, когда я пытаюсь получить атрибут conv, __getattr__ не должен вызываться.

from torch import nn
class NE_Conv2d(nn.Module):
    '''Nonexpansive conv2d'''

    def __init__(self, *k, **kw):
        super(NE_Conv2d, self).__init__()
        self.conv = nn.Conv2d(*k, **kw)
        print('foo')

    def __getattr__(self, attr):
        return getattr(self.conv, attr)

a = NE_Conv2d(3, 32, 5)
print(a)
print(a.conv)

Над кодом должен выводиться информация о a и a.conv, но при попытке получить a.conv.

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