Python __getattr__被调用并输入无限递归,即使该属性不丢失

时间:2019-06-07 16:00:37

标签: python python-3.x pytorch

我定义一个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)

以上代码应打印有关aa.conv的信息,但是在尝试获取a.conv时输入无限递归。

1 个答案:

答案 0 :(得分:0)

我似乎知道这是怎么回事... setattr中的getattrnn.Module已重新加载...