Python 3.x 为什么这两个类在Python3.x中执行,;他们';重新定义?

Python 3.x 为什么这两个类在Python3.x中执行,;他们';重新定义?,python-3.x,Python 3.x,为什么要执行这两个类?我刚刚定义了两个基类。我没有使用f=f()和g=g()来实例化对象。为什么要打印这两张照片 class F(): print("F.__new__called") class G: print("G.__new__called") print("test") 输出: F.__new__called G.__new__called test 与Python3文档9.3.1(重点内容)一

为什么要执行这两个类?我刚刚定义了两个基类。我没有使用
f=f()
g=g()
来实例化对象。为什么要打印这两张照片

class F():
    print("F.__new__called")
    
class G:
    print("G.__new__called")

print("test")
输出:

F.__new__called
G.__new__called
test
与Python3文档9.3.1(重点内容)一样:

类定义的最简单形式如下所示:

class ClassName:
  <statement-1>
  .
  .
  .
  <statement-N>
类名:
.
.
.
类定义(如函数定义(def语句))必须在生效之前执行。(您可以将类定义放在if语句的分支中或函数中。)

在实践中,类定义中的语句通常是函数定义,但允许使用其他语句,有时也很有用,我们将在后面讨论。类中的函数定义通常有一种特殊形式的参数列表,由方法的调用约定决定——同样,这将在后面解释

就Python而言,在
定义中允许使用任何语句,甚至超出了典型的属性赋值和函数定义。这些语句立即运行,这与定义函数时必须运行
def
语句的意义相同

class ClassName:
  print("hey")
  a = 2

  def f():
     print("test")
  
(文档显然不会返回到块中其他语句的实用程序,尽管其他示例在9.6代码块中交错分配私有变量引用。)


但是,与打印语句的内容不同,这些内容与“F.\U new\U called”不对应;它只对应于正在定义的类。当您调用
f=f()
时,Python将调用方法
\uuuuunew\uuuuu
\uuuuuu init\uuuuuu
,然后它们将负责构建对象。

考虑解释器如何在代码中运行。当它看到一个类定义(
class
statement)时,它只创建一个新名称空间,并在新名称空间中执行其中的所有语句。这就是打印语句被执行的原因

当解释器看到函数定义(
def
语句)时,它将当前命名空间中的函数名绑定到函数对象(表示函数的代码)


在上面的类中,所有语句都在名称空间
ClassName
中执行。因此,执行
print(“hey”)
,并执行赋值
a=2
。由于
a
位于命名空间
ClassName
中,因此可以将其称为
ClassName.a
。语句
def(self):
也会被执行,但由于它是一个函数定义,因此名称
ClassName.f
绑定到函数对象,调用时(
ClassName.f()
)会执行函数代码。

与函数不同,类主体语句在创建类时执行。@Henry Tjhia它属于类的方法吗?属性?或者两者都不懂?我不太明白这句话“也会被执行,但因为它是一个函数定义,名称ClassName.f绑定到函数对象,当调用它时(ClassName.f())”,你能详细解释一下吗?