python - 尽管我还没有创建该类的实例,但为什么要从类中打印(x)?

标签 python oop

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

一个classcreated通过在单独的独立 namespace 中运行类主体中的所有语句。一旦类主体完成 executing ,命名空间被包装成一个类 object 。结果可以通过 metaclass 进行预处理,但仅此而已。

语句x += 1大致相当于x = x.__iadd__(1)augmented assignment发生在类命名空间内。它不会影响全局名称x,因为赋值发生在类命名空间中并且整数是不可变的。不变性很重要,因为该赋值右侧的 x 来自全局命名空间,即使左侧不是。

像列表这样的可变对象会以不同的方式工作。如果 x 是一个列表,x += [1] 会将 x.__iadd__([1]) 的结果重新分配给类变量x,就像整数情况一样。然而操作__iadd__就地修改列表对象。这意味着全局 xA.x 都将引用相同的扩展列表。

一个class声明,例如 def语句是一个赋值操作。您告诉解释器运行初始化您的类的代码片段。这与 def 不同,后者运行您编写的任何代码行,而是将它们编译成函数对象。

当解释器创建类命名空间时,您会看到打印输出。该类最终将一个名为 x 的变量设置为 6。如果您有 def 语句,则类命名空间中也会有函数。如果您尝试access这些函数通过类的实例,它们将被绑定(bind)为方法,因为函数对象是非数据 descriptors .

关于python - 尽管我还没有创建该类的实例,但为什么要从类中打印(x)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61789274/

相关文章:

python - 将当前列名称更改为行并替换为其他列名称

python - 实时轨迹绘图 - Matplotlib

Python 面向对象 : inefficient to put methods in classes?

oop - Lua 中元方法的继承

javascript - 在面向对象的 Javascript 中,将对象成员方法传递给事件处理程序

java - 如何在使用什么时间单位时给出 "hint"?

python - Numpy Pandas 安装失败,/dev/null 上存在沙箱冲突

python - 如何使用python选择前X列和后Y列

python - 简单的dlib程序使我的计算机崩溃

javascript - 从javascript对象中的事件处理程序访问变量