首页 > 解决方案 > 函数内部的类初始化?

问题描述

我正在尝试了解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

标签: pythonoop

解决方案


令人惊讶的是它可以工作,因为您必须在 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

推荐阅读