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

2022-06-25 12:16:32 +08:00
 JYLu

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

在 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 了,这是为什么呢?

927 次点击
所在节点    程序员
2 条回复
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
2022-06-25 17:32:27 +08:00
@clownpiece 谢谢.我大概懂了.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/862095

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX