python - 函数内部的类初始化?
问题描述
我正在尝试了解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
解决方案
令人惊讶的是它可以工作,因为您必须在 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
推荐阅读
- html - 在 nuxt.js 中使用 width:100vw 时有额外的空白
- php - 如何在 PHP 和 XML 中使用 foreach
- javascript - 有什么方法可以在课前或课后添加链接吗?
- python-3.x - Google Slides API 更新表格背景颜色
- python - 如何通过密码术解密由pycrypto在AES CTR模式下加密的文本
- sql-server - SQL 复制 - 只需要复制订阅数据库的现有表上的数据
- reactjs - 基于Ajax响应的Reactjs动态页面如何处理404?
- c - 如果指向指针的指针为 NULL,那么指针是否也必须为 NULL?
- laravel - 需要让用户使用多个凭据登录,与使用 Gmail 服务中的其他帐户功能登录相同 - Laravel
- azure - 如何将 Azure IOT Hub 与 Ionic Mobile 应用程序集成?