为什么在实例化 class 时需要括号?

Why do I need parentheses when instantiating a class?

class Human:
    def exist(self)
        return print("exists")

H1 = Human # Why do I need parentheses here? I get error if i dont put parentheses here.

H1.exist() # I get an error that says parameter 'self' unfilled.

Class Human 不接受任何参数,甚至没有 __init__ 方法。所以在创建 Human 的实例时我不能给出任何参数,所以为什么我需要括号?

我什至不知道我不明白什么,但我觉得我错过了什么。可能是关于 self.

在 function/method/macro 的调用形式为

的语言中
foo(param1, param2, param3)

那么几乎普遍正确的是,如果 foo 不带任何参数,调用将是

foo()

此外,取决于语言

foo

要么不正确,要么有其他含义。

现在让我们考虑一下你的例子,稍微扩展一下

H1 = Human
H2 = Human
H3 = Human

在这种情况下,没有调用任何东西。 H1H2H3 都分配了相同的引用,这是对 class Human 而非任何 的引用class.

的实例
H1 = Human()
H2 = Human()
H3 = Human()

在这种情况下,class被实例化 3次,这意味着__init__函数被运行单独实例化了3次,每个结果都是 Human 的不同 实例 H1H2H3 现在指向三个不同的对象,即 Human 的所有实例。由于它们是实例,因此它们具有 self.

我们需要澄清几点:

  1. 到call/invoke一个class/function编程语言专业你得用括号

  2. class/function 名称只是指它在内存中的对象,因此在不使用括号的情况下,我们实际上指的是 class/function 对象

  3. 当我们使用括号时,我们实际上 call/invoke class/function 代码和代码得到执行