python - 为什么定义类时括号是可选的,而定义函数时是必须的?

标签 python function class syntax

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

另请参阅:Python class definition syntax .

最佳答案

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

我认为函数来自数学,例如:

f(x) = x

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

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

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

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

  • 对于没有继承的es
  • 对于没有参数的方法

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

定义:

def funcA():
    return 0

def funcB(arg):
    return arg

并且您想调用该函数:

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

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

传递引用并调用它们。

声明method之间括号的语法与调用methods一致。

您需要放置那些空括号,否则解释器会给您一个方法的引用,而不是实际调用它。

所以一个好处是它使您的代码非常清晰。

定义:

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

关于python - 为什么定义类时括号是可选的,而定义函数时是必须的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22949232/

相关文章:

python - 基于 IP 或主机名的 Django 设置

C#/Sqlite 将查询结果存储为变量的简单方法

javascript - 访问类中的构造函数属性

python - 向 imshow 添加影线 - Matplotlib

python - 测试 TF 服务模型失败,字节作为字符串和字符串作为字节混淆

python - 通过拷贝修改的Numpy矩阵

c++ - 在 gtest 中将两个数组作为参数传递

c - 参数未传递给 c 内核中的函数

c++ - 我必须手动解构所有对象吗

C++ 将内部枚举用于类模板