在 python 中理解此类初始化

Understanding this class intialization in python

提问人:Marziye Hasanshahi 提问时间:10/4/2023 更新时间:10/4/2023 访问量:55

问:

我有这段代码,它是 Spikingjelly 神经网络训练功能的一部分,它在运行后在这一行上出现一些错误。我对 Python 不是很有经验,我不明白这是什么类初始化类型。

类定义和如下所示:__init__

class DVS128Gesture(sjds.NeuromorphicDatasetFolder):
    def __init__(
            self,
            root: str,
            train: bool = None,
            data_type: str = 'event',
            frames_number: int = None,
            split_by: str = None,
            duration: int = None,
            custom_integrate_function: Callable = None,
            custom_integrated_frames_dir_name: str = None,
            transform: Optional[Callable] = None,
            target_transform: Optional[Callable] = None,
    ) -> None:

和初始化:

train_data_loader = torch.utils.data.DataLoader(
    dataset=DVS128Gesture(dataset_dir, train=True, use_frame=True, frames_num=T,
                            split_by=split_by, normalization=normalization),
    batch_size=batch_size,
    shuffle=True,
    num_workers=4,
    drop_last=True,
    pin_memory=True)
test_data_loader = torch.utils.data.DataLoader(
    dataset=DVS128Gesture(dataset_dir, train=False, use_frame=True, frames_num=T,
                            split_by=split_by, normalization=normalization),
    batch_size=batch_size,
    shuffle=False,
    num_workers=4,
    drop_last=False,
    pin_memory=True)

例如,类期望:DVS128Gesture

  • 字符串 (root) 作为数据集的地址

  • 布尔值(火车)变量(这不是我们现在的兴趣)

  • 字符串

  • 分配给 frames_number 的整数值

问题:但是,初始化(在图片底部)不是按照该顺序进行的;例如,用作第 3 个参数,而类的第 3 个参数是 。useframe=Truedatatype: str = 'event'

问题:

  1. 我上面提到的问题,真的是作者的错误吗?还是我对某事的误解?

  2. 类初始化期间变量赋值的含义是什么?例如,类初始化的第 4 个参数写成 。为什么不直接写“T”呢?为什么用它代替原始的类定义?framesnum=Tframesnumframes_number

我跟踪了提到的变量、它们的声明和它们使用的类,据我所知,没有其他具有相同名称的变量。

蟒蛇 python 类

评论

1赞 rioV8 10/4/2023
它们不是位置参数,而是关键字参数(顺序不重要),函数还必须有一个参数来捕获所有未指定的关键字参数**kwargs
1赞 Michael Butscher 10/4/2023
函数调用的关键字参数由函数参数的名称、等号和值(准确地说是表达式)组成。它可以具有与函数定义中不同的顺序,因为参数名称告诉它属于哪里。对我来说,对立似乎是一个错误。frames_numframes_number

答:

0赞 Clay 10/4/2023 #1
  1. 正如评论中提到的其他人,这是一个关键字参数 (kwarg),顺序无关紧要。调用函数时,您不必/have/使用关键字,但如果您不这样做,那么所有参数都必须具有正确的顺序和位置。

  2. 这似乎是一个错误。你可以使用 instead 而不仅仅是这样,如果你以正确的顺序传递参数并不重要,但你是对的,原始类声明中没有 kwarg。也没有或kwarg,所以我对这里发生的事情持怀疑态度。可以通过添加到参数列表并将其传递给 ,从而传递父类的关键字参数,而无需在子类中专门定义它们,但这里没有这样做,父类实际上也没有这些关键字参数中的任何一个。frames_number=TTframesnumuse_framenormalization__init__**kwargssuper.init()