为什么在定义类时括号是可选的,但在定义函数时是必需的?

时间:2014-04-08 22:14:21

标签: python function class syntax

在Python中,使用空参数列表定义函数需要一组空括号。但是,使用默认超类定义class不需要一组空括号;相反,这些是可选的,似乎并不常见。为什么会这样?

另请参阅:Python class definition syntax

1 个答案:

答案 0 :(得分:9)

我认为你的问题的答案只是语法。这就是Python的设置方式,但我对它如何实现的看法是:

我认为函数来自数学之类的东西:

f(x) = x

因此,在创建计算机编程语言的过程中,从模拟数学到编程语言似乎已经存在一些逻辑连续性。

另一方面,类是计算机科学和重复内存管理的更多构造,因此它们不是以这种方式创建的,而是因为它们具有功能质量,它们被给予类似的符号。

对于Python,我将method用于function,因为这是通常的术语......

我理解您的论点,即{ - 1}}和class都应该允许使用无参数案例中的快捷方式进行定义:

  • for method es,当没有遗产时
  • 当没有参数时,{li>为class s

我能想到的一个原因是为了保持使用和定义的一致性。让我们来看一些例子:

定义:

method

你要打电话给那个功能:

def funcA():
    return 0

def funcB(arg):
    return arg

>>> funcA()
>>> functB("an argument")

传递引用并调用它们。

>>> f1 = funcA >>> f2 = funcB >>> f1() >>> f2("another argument") 声明之间的paranthesis语法与调用method一致。

你需要把那些空括号,否则解释器会给你一个methods的引用,而不是实际调用它。

因此,一个好处是它可以使您的代码非常清晰。

定义:

method

用法:

class classA:
    pass

class classB(object):
    pass

此处,# create an instance my_instance_of_A = classA() my_instance_of_B = classB() # pass a reference my_ref_to_A = classA my_ref_to_B = classB # call by reference new_A = my_ref_to_A() new_B = my_ref_to_B() 是否继承的行为没有变化,其调用行为取决于其内部或继承的class方法的定义。

我认为当前需要空__init__的设置使代码对未经训练的眼睛更具可读性。

如果你真的真的想做你所要求的,那就有一个解决方法......你总是可以这样做:

()

可以称之为:

func = lambda: "im a function declared with no arguments, and I didn't use parenthesis =p"

但是python holy book says No