Python pass语句在函数中的角色?

Python pass语句在函数中的角色?,python,python-3.x,Python,Python 3.x,我是面向对象编程的新手。定义类之后,我们只需创建对象并尝试访问类中的不同变量和函数。在下面的代码中,我想知道为什么我们再次提到函数ans中的类Dataset;其次,pass语句的作用是什么 def read_data_set(): class Dataset: pass data_sets = Dataset() return(data_sets) #Function call x=read_data_set() print(x) 它基本上什么也

我是面向对象编程的新手。定义类之后,我们只需创建对象并尝试访问类中的不同变量和函数。在下面的代码中,我想知道为什么我们再次提到函数ans中的类Dataset;其次,pass语句的作用是什么

def read_data_set():
    class Dataset:
        pass
    data_sets = Dataset()
    return(data_sets)
    #Function call
x=read_data_set()
print(x)

它基本上什么也不做

它通常用作占位符,就像在代码中一样;您会注意到,如果没有
传递,代码根本不会运行

class-SomeClass:
通行证#待填写
这是因为Python希望某些内容在
SomeClass
的定义下,但如果为空则会引发
IndentationError

class-SomeClass:

#要填充
pass
什么都不做,它只会使Python缩进正确


假设您想创建一个空函数,例如:

def empty_func():
空的_func()#抛出缩进错误
让我们试着在里面放一条评论:

def empty_func_with_comment():
    # empty

empty_func_with_comment()  # throws IndentationError
要使其正常工作,我们需要使用pass修复压痕:

def empty_func_with_pass():
    pass

empty_func_with_pass()  # it works 

pass语句意味着初始化类时不定义构造函数或任何属性。尝试引用它:您看到的错误是由于Python会期望下面的行属于您的类的事实,并且会考虑使用的缩进是不正确的。


关于在函数中再次调用类名的事实:这意味着您正在实例化刚才定义的类。因此,函数返回的是类的对象

为什么我们在函数中两次提到类数据集?

第一次

class Dataset:
    pass
定义了类

第二个:

data_sets = Dataset()
将创建此类(对象)的实例。正如OP所写的:

定义类之后,我们只需创建对象

因为
class
只是一个python语句,所以它可以在任何地方使用:包括函数体,就像在本例中一样。因此,在这里,每次调用函数
read\u data\u set()
时都会定义该类,如果不调用,则根本不定义该类


pass语句的作用是什么?

在这个例子中

class Dataset:
    pass
pass
语句意味着定义一个没有添加成员的类。这意味着类及其对象只包含一些由任何类从
object
派生的“默认”函数和变量(也称为方法和字段)


通常,当您引入新块并希望将其保留为空时,将使用
pass

expression:
    pass 
必须在块中至少包含一条指令,这就是为什么有时需要
pass
来表示不想在块中执行任何操作。对于功能而言,这是正确的:

def do_nothing():
    pass  # function that does nothing
循环:

for i in collection:  # just walk through the collection
    pass              # but do nothing at each iteration
异常处理:

try:
    do_something()
except SomeException:
    pass    #  silently ignore SomeException
上下文管理器:

with open(filename):    # open a file but do nothing with it
    pass

“为什么我们要再提一遍”…?!在一个步骤中定义
类数据集
,在下一个步骤中实例化它。顺便说一句,在函数中定义一个类没有多大意义。这看起来像是非常糟糕的示例代码。请看,我没有提到整个代码。我定义了由几个变量和函数组成的类Dataset,然后定义了一个函数read_data_set,它调用calss Dataset。我只是想理解这段代码。为什么这是一种不好的做法?一个类只能定义一次。通过将它放在函数中,每次调用函数时都会重新定义它。有时这可能会有用处,但通常情况下,每次调用函数时都会做一些不必要的工作我理解为什么您可能会询问有关
pass
,但我不理解代码其余部分有什么不清楚的地方。你能澄清你不明白的地方吗?那么,如果它什么都不做,为什么需要它?我提到过,在某些情况下,它被用作占位符,否则代码根本不会运行。如果
pass
什么都不做,为什么它不会运行呢?我添加了有关
IndentationError
的详细信息。因此,这意味着如果我想在函数内部创建某个对象(在类外部定义),首先,我必须用pass语句再次定义该类,然后我可以调用构造函数为什么类初始化是必需的?我运行了上面的代码,省略了类Dataset和pass语句,它仍然有效fine@user因为你以前在别的地方定义过这个类?是的,重新定义它是非常多余的,而且会产生反作用。@user10163680如果在调用要使用它的函数之前声明了类,那么就不需要使用
pass
重新定义类。只有在尚未定义或不想更改定义的情况下,才可能不想在函数中定义类。如果已经定义了类,则重新定义它将取消以前对函数范围的定义。因此,函数返回的对象没有函数外定义的任何属性/方法