【问题标题】:Why are parenthesis optional when defining a class, but mandatory when defining a function?为什么定义类时括号是可选的,但定义函数时是必需的?
【发布时间】:2014-04-08 22:14:20
【问题描述】:

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

另请参阅:Python class definition syntax

【问题讨论】:

  • 为什么不应该这样呢?类不是函数。投票结束,因为我认为这是一个基于意见的问题。我怀疑有一个客观的答案。
  • In 2005 不允许使用空括号。
  • 投票重新开放是因为我认为 Python 的行为有一个客观的历史原因(即使它已经改变了几次)。编程语言的历史知识可帮助您了解如何更好地使用它。
  • 这是一个语言(语法)设计问题。语言设计可能比意见更多。
  • 尽管除非你是荷兰人,否则这种设计可能是一种观点。

标签: python function class syntax


【解决方案1】:

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

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

f(x) = x

因此,在创建计算机编程语言时,从模拟数学到编程语言似乎存在某种逻辑连续性。

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

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

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

  • classes 没有继承时
  • methods 没有参数时

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

定义:

def funcA():
    return 0

def funcB(arg):
    return arg

你想调用那个函数:

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

>>> f1 = funcA
>>> f2 = funcB
>>> f1()
>>> f2("another argument")

传递引用并调用它们。

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"

可以调用:

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

但是python holy book says No

【讨论】:

  • 这个问题需要一个更简单的答案。
  • @carloswm85 我的第一句话是我认为最简单的答案。堆栈溢出的好处是你也可以添加答案!
猜你喜欢
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
相关资源
最近更新 更多