【问题标题】:Python static class member: access via instance [duplicate]Python静态类成员:通过实例访问[重复]
【发布时间】:2017-09-27 08:17:41
【问题描述】:

我有一堂课:

class A:
  x = 12

这两种访问形式对静态成员有什么区别?:

a = A()
print(a.x)  # >> 12
print(a.__class__.x) # >> 12

【问题讨论】:

  • 在这种情况下没有,但您可以通过直接分配给实例来隐藏类命名空间。

标签: python class oop static-members


【解决方案1】:

获取值时没有区别; a.x 将退回到A.x(与a.__class__.x 相同)。

但是,如果您尝试设置一个值,a.x = 13 将设置一个新的实例变量,而将 A.x 保留为原始值。从那时起,a.x 将始终找到实例值而不是类一。

【讨论】:

    【解决方案2】:

    没有区别,都是一样的。这与 python 如何查找它的属性有关。

    它首先查看 instance 属性,如果没有找到它,它会查看 class 属性,依此类推。

    在第二个语句 (a.__class__.x) 中,您明确告诉 python 直接查看类字典,跳过实例查找。

    【讨论】:

      【解决方案3】:

      这里,a.x 返回类实例的变量值(范围仅限于类对象),而A.x 返回类变量的值。您可以像这样验证它:

      # create object of class A()
      >>> a = A()
      >>> b = A()
      
      # same value
      >>> A.x   
      12
      >>> a.x
      12
      
      # updated a.x
      >>> a.x = 5
      >>> A.x   # still old value
      12
      >>> a.x   # new value
      5
      >>> b.x    # old value
      12
      
      # updated A.x
      >>> A.x = 9  # new value
      >>> A.x
      9
      >>> a.x   # old value
      5
      >>> b.x  # new value
      9
      

      结论:如果更新类实例的值,则更改将仅限于该实例。但是,如果您更改类变量的值,如果实例没有显式覆盖该值,则更改将反映到所有实例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-25
        • 2012-07-02
        • 2019-07-13
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        相关资源
        最近更新 更多