【问题标题】:Class variable not updating in depending other class variable类变量不更新依赖于其他类变量
【发布时间】:2021-02-26 04:29:03
【问题描述】:
class Circle:
    a = 2
    b = a

#print class variables 
print(Circle.a)
print(Circle.b)

2
2

# updating class variable a to value 100
Circle.a = 100

# printing updated class variables
print(Circle.a)
print(Circle.b)

100
2

为什么类变量 b 也不更新为 100 ? 我可以在没有 setter 方法的情况下更改变量吗?

【问题讨论】:

  • 因为整数是不可变的,不可变的变量不是通过引用传递的,而可变对象是,例如listdict。将a 设置为list,然后将append 设置为b,以查看它们现在已“链接”。
  • @Mandera 这是一个常见的误解,即赋值与可变性有关。赋值对可变和不可变对象的工作方式相同。这里的解释很简单,最初,名称ab 都指向内存中的相同值(2)(赋值从不复制数据)。然后,a重新分配以指向值100名称是独立重新分配的。对于列表或字典,您会观察到完全相同的行为。
  • @timgeb 有道理,谢谢你的启发!
  • @Mandera 没问题,这是 Ned 的video,它比我在评论中更好地解释了这个问题。

标签: python oop variables updating class-variables


【解决方案1】:

名称ab 都指向内存中的相同值(2)(赋值从不复制数据)。然后,a重新分配以指向值 100Names are reassigned independently.

你这样做了:

a = 2
b = a

a ----> 2
        ^
       / 
b ----/

a = 100

a ----> 100
b ----> 2

【讨论】:

    【解决方案2】:

    这对于@property 装饰器来说是一个让b 指向a 的好地方。然而,这些不适用于classmethods。我找到https://stackoverflow.com/a/13624858/3936044 为我们创建了一个漂亮的小@classproperty 装饰器。将其应用于您的代码将如下所示:

    class classproperty:
        def __init__(self, fget):
            self.fget = fget
    
        def __get__(self, owner_self, owner_cls):
            return self.fget(owner_cls)
    
    class Circle:
        a = 2
    
        @classproperty
        def b(cls):
            return cls.a
    
    #print class variables
    print(Circle.a)
    print(Circle.b)
    
    2
    2
    
    # updating class variable a to value 100
    Circle.a = 100
    
    # printing updated class variables
    print(Circle.a)
    print(Circle.b)
    
    100
    100
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多