在Python中,使用空参数列表定义函数需要一组空括号。但是,使用默认超类定义class
不需要一组空括号;相反,这些是可选的,似乎并不常见。为什么会这样?
答案 0 :(得分:9)
我认为你的问题的答案只是语法。这就是Python的设置方式,但我对它如何实现的看法是:
我认为函数来自数学之类的东西:
f(x) = x
因此,在创建计算机编程语言的过程中,从模拟数学到编程语言似乎已经存在一些逻辑连续性。
另一方面,类是计算机科学和重复内存管理的更多构造,因此它们不是以这种方式创建的,而是因为它们具有功能质量,它们被给予类似的符号。
对于Python,我将method
用于function
,因为这是通常的术语......
我理解您的论点,即{ - 1}}和class
都应该允许使用无参数案例中的快捷方式进行定义:
method
es,当没有遗产时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"