x = 5
class A:
x += 1 # here we can access and change the value of x in class but only for class
print(f"x from inside class is {x}")
print(x)
尽管我没有从类 A 中创建实例,但为什么要在类内部打印
最佳答案
Python 代码是 executed从上到下。语句class A
触发创建一个新的类对象,当达到取消缩进时,该对象将被最终确定并分配给全局名称A
。
一个class是 created通过在单独的独立 namespace 中运行类主体中的所有语句。一旦类主体完成 executing ,命名空间被包装成一个类 object 。结果可以通过 metaclass 进行预处理,但仅此而已。
语句x += 1
大致相当于x = x.__iadd__(1)
。 augmented assignment发生在类命名空间内。它不会影响全局名称x
,因为赋值发生在类命名空间中并且整数是不可变的。不变性很重要,因为该赋值右侧的 x
来自全局命名空间,即使左侧不是。
像列表这样的可变对象会以不同的方式工作。如果 x
是一个列表,x += [1]
会将 x.__iadd__([1])
的结果重新分配给类变量x
,就像整数情况一样。然而操作__iadd__
就地修改列表对象。这意味着全局 x
和 A.x
都将引用相同的扩展列表。
一个class
声明,例如 def
语句是一个赋值操作。您告诉解释器运行初始化您的类的代码片段。这与 def
不同,后者不运行您编写的任何代码行,而是将它们编译成函数对象。
当解释器创建类命名空间时,您会看到打印输出。该类最终将一个名为 x
的变量设置为 6
。如果您有 def 语句,则类命名空间中也会有函数。如果您尝试access这些函数通过类的实例,它们将被绑定(bind)为方法,因为函数对象是非数据 descriptors .
关于python - 尽管我还没有创建该类的实例,但为什么要从类中打印(x)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61789274/