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())”,你能详细解释一下吗?