Your snipped is valid with respect to the forward pass, BUT your class Something won’t register the parameters of func2 (neither func1). So you will have to manually save and load their parameters, and you’ll have to add those parameters to the optimizer explicitly (model.parameters() won’t return them).
Couldn’t you, instead of using functions, use modules ? Witch would not have those drawback, ex:
import torch
import torch.nn as nn

def func1(a):
    ## Body of the func
    return 

class Module2(nn.Module):
    def __init__(self):
        super().__init__()

    def forward(self,a,b):
    ## Body of the module
    return 

class Something(nn.Module):
    def __init__(self,a):
        super().__init__()
        self.something = func1(a)
        self.module2 = Module2()

    def forward(self,a,b):
        x = self.module2(a,b)

Note that I did not change func1 as I’m not sure which behavior you want regarding gradients here.