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

ger*_*rit 14 python syntax class function

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

另请参见:Python类定义语法.

Far*_*Joe 9

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

我认为函数来自数学的东西,如:

f(x) = x
Run Code Online (Sandbox Code Playgroud)

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

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

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

我理解你的论点,即a classmethod应该允许在无参数情况下使用快捷方式来定义:

  • 因为class没有遗产的时候
  • 对于method没有参数的s

我能想到的一个原因是使用和定义的一致性.我们来看一些例子:

定义:

def funcA():
    return 0

def funcB(arg):
    return arg
Run Code Online (Sandbox Code Playgroud)

你想打电话给那个功能:

>>> funcA()
>>> functB("an argument")
Run Code Online (Sandbox Code Playgroud)

>>> f1 = funcA
>>> f2 = funcB
>>> f1()
>>> f2("another argument")
Run Code Online (Sandbox Code Playgroud)

传递引用并调用它们.

method声明之间的paranthesis的语法与调用methods.

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

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

定义:

class classA:
    pass

class classB(object):
    pass
Run Code Online (Sandbox Code Playgroud)

用法:

# 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()
Run Code Online (Sandbox Code Playgroud)

对于是否class继承,行为没有变化,其调用行为由其内部或继承__init__方法定义为什么决定.

我认为当前要求空的设置()使得代码对于未经训练的眼睛更具可读性.

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

func = lambda: "im a function declared with no arguments, and I didn't use parenthesis =p"
Run Code Online (Sandbox Code Playgroud)

可以称之为:

>>> func
<function <lambda> at 0x6ffffef26e0>
>>> func()
"im a function declared with no arguments, and I didn't use parenthesis =p"
Run Code Online (Sandbox Code Playgroud)

但是蟒蛇圣书说不

  • 这个问题需要一个更简单的答案。 (2认同)
  • @carloswm85 我的第一句话是我认为最简单的答案。堆栈溢出的好处是您还可以添加答案! (2认同)