关于python中的类属性和实例属性

学的时候我以为我懂了,遇到问题的时候我发现,其实我没懂,请看示例:

python 复制代码
class TestConfigObject:
    config_file_name = "default"

    def __init__(self, context=None, *args, **kwargs):
        self.config_file_name = "2"

class TestChild(TestConfigObject):
    def __init__(self):
        super().__init__()
        self.config_file_name = "3"

if __name__=="__main__":
    TestConfigObject.config_file_name = "1"
    print("应该为1:" + str(TestConfigObject.config_file_name))
    test2 = TestConfigObject()
    print("应该为2:"+str(test2.config_file_name))
    print("应该为2:"+str(TestConfigObject.config_file_name))
    test3 = TestChild()
    print("应该为3:" + str(test3.config_file_name))
    print("应该为3:" + str(TestConfigObject.config_file_name))
    print("应该为3:" + str(test2.config_file_name))

打印出来:

应该为1:1

应该为2:2

应该为2:1

应该为3:3

应该为3:1

应该为3:2

应该为的值 是我开始我的理解,实际上不是这样。因为

config_file_name 被定义为类属性,但在 __init__ 方法中,你尝试将其赋值给 self.config_file_name,这实际上创建了一个实例属性,覆盖了类属性。因此,当你访问 test2.config_file_nametest3.config_file_name 时,你访问的是实例属性,而不是类属性。

要实现类属性和实例属性的共享,需要确保在实例方法中修改的是类属性,而不是创建一个新的实例属性。以下是修改后的代码:

python 复制代码
class TestConfigObject:
    config_file_name = "default"

    def __init__(self, context=None, *args, **kwargs):
        TestConfigObject.config_file_name = "2"

class TestChild(TestConfigObject):
    def __init__(self):
        super().__init__()
        TestConfigObject.config_file_name = "3"

if __name__=="__main__":
    TestConfigObject.config_file_name = "1"
    print("应该为1:" + str(TestConfigObject.config_file_name))
    test2 = TestConfigObject()
    print("应该为2:"+str(test2.config_file_name))
    print("应该为2:"+str(TestConfigObject.config_file_name))
    test3 = TestChild()
    print("应该为3:" + str(test3.config_file_name))
    print("应该为3:" + str(TestConfigObject.config_file_name))
    print("应该为3:" + str(test2.config_file_name))
相关推荐
Code_流苏42 分钟前
《Python星球日记》 第69天:生成式模型(GPT 系列)
python·gpt·深度学习·机器学习·自然语言处理·transformer·生成式模型
于壮士hoho1 小时前
Python | Dashboard制作
开发语言·python
掘金-我是哪吒2 小时前
分布式微服务系统架构第131集:fastapi-python
分布式·python·微服务·系统架构·fastapi
小猪快跑爱摄影2 小时前
【Folium】使用离线地图
python
keke102 小时前
Java【10_1】用户注册登录(面向过程与面向对象)
java·python·intellij-idea
微刻时光3 小时前
影刀RPA网页自动化总结
运维·人工智能·python·低代码·自动化·rpa·影刀rpa
WenGyyyL3 小时前
研读论文——《用于3D工业异常检测的自监督特征自适应》
人工智能·python·深度学习·机器学习·计算机视觉·3d
AI视觉网奇3 小时前
3d关键点 可视化
开发语言·python·pygame
belldeep3 小时前
python:trimesh 用于 STL 文件解析和 3D 操作
python·3d·stl
顾一大人4 小时前
dp自动化登陆之hCaptcha 验证码
爬虫·python·自动化