函数内部的类初始化?

时间:2018-08-21 10:06:21

标签: python oop

我试图理解python的面向对象编程。

在以下代码中,当我省略类Dataset并从函数read_data_set中传递语句并尝试在不提供任何参数的情况下创建对象时-我收到错误,提示位置参数丢失。但是,当我运行此代码而不遗漏任何内容时,即使在创建对象时没有提及位置参数,它也可以正常工作。

在这种情况下为什么不引发错误?有人可以指导我以下代码中发生了什么吗?

第二,我还想知道,当我通过pass语句提及类Dataset时,是否意味着我正在创建一个新类,还是意味着我正在重新定义它?

class Dataset:
    def __init__(self,MC_sample,MC_label):
        self.__MC_sample = MC_sample
        self.__MC_label = MC_label

def read_data_set():
    class Dataset:
        pass
    data_sets = Dataset()  #object created
    return data_sets

1 个答案:

答案 0 :(得分:0)

它起作用的原因很令人惊讶,因为您必须在def ...行之后有缩进。

如果您有缩进:

class Dataset:
    def __init__(self,MC_sample,MC_label):
        self.__MC_sample = MC_sample
        self.__MC_label = MC_label

def read_data_set():
    class Dataset:
        pass
    data_sets = Dataset()  #object created
    return data_sets

它起作用,并且read_data_set内部的DataSet类遮蔽了外部的类。

如果省略类Dataset:pass,它会尝试初始化第一个DataSet,该数据集在构造函数中需要2个参数(MC_sample和MC_label),因此会出现错误。

因此,您可以像这样创建课程:

data_sets = Dataset('MC_sample', 'MC_label')  #object created

或在构造函数中提供默认值:

def __init__(self,MC_sample='default MC_sample',MC_label='default MC_label'):
    self.__MC_sample = MC_sample
    self.__MC_label = MC_label