fill_super
时间: 2023-08-06 22:04:26 浏览: 62
fill_super 是一个函数,用于在 Python 中调用父类的构造函数。当需要在子类中重写构造函数时,可以使用 fill_super 来调用父类的构造函数,以确保父类的初始化代码也被执行。
在使用 fill_super 时,需要传入当前子类的类名和 self 对象作为参数。这样,fill_super 就会自动找到当前子类的父类,并调用父类的构造函数。
以下是一个示例代码:
```python
class ParentClass:
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
# 父类的初始化代码
class ChildClass(ParentClass):
def __init__(self, arg1, arg2, arg3):
fill_super(ChildClass, self) # 调用父类的构造函数
self.arg3 = arg3
# 子类的初始化代码
# 创建子类对象
obj = ChildClass('arg1', 'arg2', 'arg3')
```
在上述示例中,ChildClass 继承了 ParentClass,并在自己的构造函数中使用 fill_super 来调用 ParentClass 的构造函数。这样,obj 对象就会同时拥有 ParentClass 和 ChildClass 中定义的属性。
相关问题
展示Linux内核的mount_single(fs_type, flags, data, pstore_fill_super);函数源代码,尽量详细介绍其源代码
mount_single是Linux内核用于挂载单个文件系统的函数,其定义在文件fs/super.c中。其源代码如下:
```
struct file_system_type *get_fs_type(const char *name)
{
struct file_system_type *fs_type = NULL;
read_lock(&file_systems_lock);
fs_type = __get_fs_type_locked(name);
read_unlock(&file_systems_lock);
return fs_type;
}
struct super_block *mount_single(struct file_system_type *fs_type, int flags,
const void *data, int (*fill_super)(struct super_block *, void *, int))
{
struct super_block *s = NULL;
struct dentry *root = NULL;
int err;
if (!fs_type || !fill_super)
return ERR_PTR(-EINVAL);
err = security_sb_mount(fs_type, flags, data);
if (err)
return ERR_PTR(err);
s = sget(fs_type, NULL, set_anon_super, flags, NULL);
if (IS_ERR(s))
return s;
if (!(s->s_flags & MS_NOUSER))
err = user_namespace_sem(&s->s_user_ns);
if (!err)
err = fill_super(s, (void *)data, flags & MS_SILENT ? 1 : 0);
if (err)
goto out_err;
if (s->s_root) {
root = dget(s->s_root);
if (!(flags & MS_RDONLY) && sb_rdonly(s))
goto out_err;
if (!(flags & MS_NOATIME))
sb_post_addmount(s, flags & MS_RDONLY ? MNT_READONLY_ATIME : MNT_ATIME);
if (flags & MS_ACTIVE) {
err = activate_super(s, flags);
if (err)
goto out_err;
}
if (!(flags & MS_SILENT))
pr_notice("%s: mounted filesystem with%s data mode. "
"Opts: %s\n", s->s_id, sb_rdonly(s) ? " read-only" : "",
(char *)data);
dput(root);
return s;
}
out_err:
deactivate_locked_super(s);
return ERR_PTR(err);
}
```
函数的第一个参数是文件系统类型,其类型为struct file_system_type。第二个参数是挂载选项,用于指定文件系统的挂载方式,如只读挂载、读写挂载等。第三个参数是指向挂载数据的指针,其类型为void *。最后一个参数是一个函数指针,用于初始化super_block结构体。
函数首先会进行安全检查,然后调用sget函数创建一个super_block结构体。如果创建失败,函数将返回一个错误指针。否则,函数会调用fill_super函数初始化super_block结构体,如果初始化失败,函数将释放super_block结构体并返回错误指针。
如果super_block结构体初始化成功,则函数将检查是否需要进行用户命名空间的处理,然后将文件系统挂载到指定的目录下。如果挂载成功,函数将返回super_block结构体。
值得注意的是,mount_single函数只能用于挂载单个文件系统。如果需要挂载多个文件系统,应该使用mount_multi函数。
class AffineLayer(nn.Module): def __init__(self, num_channels, bias=False): super(AffineLayer, self).__init__() weight = torch.FloatTensor(1, num_channels, 1, 1).fill_(1) self.weight = nn.Parameter(weight, requires_grad=True) self.bias = None if bias: bias = torch.FloatTensor(1, num_channels, 1, 1).fill_(0) self.bias = nn.Parameter(bias, requires_grad=True) def forward(self, X): out = X * self.weight.expand_as(X) if self.bias is not None: out = out + self.bias.expand_as(X) return out
这是一个 PyTorch 中的仿射层(Affine Layer)的实现,它可以对输入进行线性变换和平移。其中,num_channels 表示输入的通道数,bias 表示是否使用偏置。在初始化时,权重矩阵的元素都被初始化为 1,偏置矩阵的元素被初始化为 0。在前向传播时,对输入进行线性变换后加上偏置(如果有)。最后返回处理后的输出。