V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JYLu
V2EX  ›  程序员

新手请教: 类属性(attribute)和类成员属性之间有什么关系呢?应该是与命名空间(name space)有关.

  •  
  •   JYLu · 2022-06-25 12:16:32 +08:00 · 892 次点击
    这是一个创建于 643 天前的主题,其中的信息可能已经有所发展或是发生改变。

    楼主正在自学数据结构.写别的练习时遇到了一点小问题.向大家请教.谢谢啦!

    在 Python 中,类成员可以直接访问类属性.比如

    class A:
        a=1
    
    class B(A):
        b=6
    
    x=B()
    
    print(x.a)
    

    会显示

    1
    

    对类属性的修改会导致通过类成员访问这一属性时发生改变:

    class A:
        a=1
    
    class B(A):
        b=6
    
    x=B()
    
    print(A.a, x.a, x.a is A.a)
    
    A.a = 2
    
    print(A.a,x.a, A.a is x.a)
    
    

    输出为:

    1 1 True
    2 2 True
    
    

    这些我大概还是理解的,但是下面事情变得复杂:

    class A:
        a=1
    
    class B(A):
        b=6
    
    x=B()
    
    print(A.a, x.a, x.a is A.a)
    
    A.a = 2
    
    print(A.a,x.a, A.a is x.a)
    
    x.a = 0
    
    print(A.a,x.a, x.a is A.a)
    
    A.a = 3
    print(A.a,x.a, x.a is A.a)
    
    A.a = 0
    print(A.a, x.a, A.a is x.a)
    
    print(2 is 2 )
    

    输出为:

    1 1 True
    2 2 True
    2 0 False
    3 0 False
    0 0 True
    True
    

    以及如果使用可变类型赋值

    class A:
        a=[1]
    
    class B(A):
        b=[6]
    
    x=B()
    
    print(A.a, x.a, x.a is A.a)
    
    A.a = [2]
    
    print(A.a,x.a, A.a is x.a)
    
    x.a = [0]
    
    print(A.a,x.a, x.a is A.a)
    
    A.a = [3]
    print(A.a,x.a, x.a is A.a)
    
    A.a = [0]
    print(A.a, x.a, A.a is x.a)
    
    print([2] is [2] )
    

    会显示:

    [1] [1] True
    [2] [2] True
    [2] [0] False
    [3] [0] False
    [0] [0] False
    False
    
    

    我的问题:

    1.为什么会产生这种区别?

    2.用代码

    x.a = 0
    

    x.a = [0]
    

    改变类成员属性时发生了什么呢?为什么不会改变类属性 A.a 呢?

    3.在修改过 x.a 后,修改 A.a 就不会影响 x.a 了,这是为什么呢?

    2 条回复    2022-06-25 17:32:27 +08:00
    clownpiece
        1
    clownpiece  
       2022-06-25 13:41:17 +08:00
    A.a = 0 那个是因为 python 缓存的小整数 用 257 就不会了

    对实例属性赋值产生新的对象就类似于函数内对外部存在的对象赋值会产生一个新对象一样,涉及到 python 命名空间的设计

    https://docs.python.org/zh-cn/3/tutorial/classes.html#python-scopes-and-namespaces
    JYLu
        2
    JYLu  
    OP
       2022-06-25 17:32:27 +08:00 via Android
    @clownpiece 谢谢.我大概懂了.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2872 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:24 · PVG 22:24 · LAX 07:24 · JFK 10:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.