关于python类属性和实例属性的一些细节注意点

发布时间:2025-05-24 16:17:11 作者:益华网络 来源:undefined 浏览量(0) 点赞(0)
摘要:关于python类属性和实例属性,简单来说,类属性就是在定义类的时候,和类方法同一级别定义的属性;实例属性是在__init__实例初始化时候定义属性。 单纯从实例的角度来看, 类属性和实例属性都可以在实例中用self.属性名称的方法进行访

关于python类属性和实例属性,简单来说,类属性就是在定义类的时候,和类方法同一级别定义的属性;实例属性是在__init__实例初始化时候定义属性。

单纯从实例的角度来看, 类属性和实例属性都可以在实例中用self.属性名称的方法进行访问更新,相对于在实例方法中的局部属性,可以进行实例全局该属性修改,很多时候甚至都混用了。

其实类属性还可以直接用类名.类 属性名称方法直接访问,即时没有实例化。这个就是不要的类不要import,也会占用内存空间,即便那个类没有实例化。同时这个类属性方法的内存空间是所有实例化对象共享的,理论上实例对象A更新了类属性,B中这个属性也会更新,某个方面就实现跨实例的全局变量,可以用作实例直接交互。

这里有一些细节点要注意的,就是如果类属性是int,string,float,tuple这样不可变类型,那边其实每个实例更改的时候,就会新建一个,并不会修改原来的,这些类型的类属性就是和实例属性一个样;而可变类型dict set list,还有实例对象;这些就真正全局更新,只有一个类的实例对象修改,所有该类的实例对象都会改变。

最后还有一点,很容易忽视的,就是如果使用python Multiprocessing多线程处理的时候,不要尝试用这些类属性进行通信,因为可能一个实例在读,另一个已经修改了。还是用queue,这个是线程安全的。

下面代码示例说明。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class TreeNode:
intItem= 5
StringItem = Test
listItem = [1,2,3,4]
Dict = {1:2,2:4}
def __init__(self, x):
self.Intval = x
self.listval= [A,B]
A = TreeNode(1)
B = TreeNode(2)
print("TreeNode.intItem:%s, TreeNode.listItem:%s" %(TreeNode.intItem,TreeNode.listItem))
print("A:%s, B:%s" %(A.intItem, B.intItem))
print("A:%s, B:%s" %(A.StringItem, B.StringItem))
print("A:%s, B:%s" %(A.listItem, B.listItem))
print("A:%s, B:%s" %(A.Dict, B.Dict))
print("A:%s, B:%s" %(A.listval, B.listval))
A.intItem = 8
A.StringItem = Test2
A.listItem.insert(-1,5)
A.Dict[3] = 9
A.listval.insert(-1,5)
print("========only update A=========")
print("TreeNode.intItem:%s, TreeNode.listItem:%s" %(TreeNode.intItem,TreeNode.listItem))
print("A:%s, B:%s" %(A.intItem, B.intItem))
print("A:%s, B:%s" %(A.StringItem, B.StringItem))
print("A:%s, B:%s" %(A.listItem, B.listItem))
print("A:%s, B:%s" %(A.Dict, B.Dict))
print("A:%s, B:%s" %(A.listval, B.listval))

二维码

扫一扫,关注我们

声明:本文由【益华网络】编辑上传发布,转载此文章须经作者同意,并请附上出处【益华网络】及本页链接。如内容、图片有任何版权问题,请联系我们进行处理。

感兴趣吗?

欢迎联系我们,我们愿意为您解答任何有关网站疑难问题!

您身边的【网站建设专家】

搜索千万次不如咨询1次

主营项目:网站建设,手机网站,响应式网站,SEO优化,小程序开发,公众号系统,软件开发等

立即咨询 15368564009
在线客服
嘿,我来帮您!