关于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))
相关推荐
Cha0DD4 小时前
【由浅入深探究langchain】第二十集-SQL Agent+Human-in-the-loop
人工智能·python·ai·langchain
Cha0DD4 小时前
【由浅入深探究langchain】第十九集-官方的SQL Agent示例
人工智能·python·ai·langchain
智算菩萨5 小时前
【Tkinter】4 Tkinter Entry 输入框控件深度解析:数据验证、密码输入与现代表单设计实战
python·ui·tkinter·数据验证·entry·输入框
七夜zippoe6 小时前
可解释AI:构建可信的机器学习系统——反事实解释与概念激活实战
人工智能·python·机器学习·可解释性·概念激活
YuanDaima20489 小时前
[CrewAI] 第15课|构建一个多代理系统来实现自动化简历定制和面试准备
人工智能·python·面试·agent·crewai
WHS-_-20229 小时前
Python 算法题学习笔记一
python·学习·算法
码界筑梦坊9 小时前
353-基于Python的大湾区气候数据可视化分析系统
开发语言·python·信息可视化·数据分析·django·vue·毕业设计
如何原谅奋力过但无声10 小时前
【chap11-动态规划(上 - 基础题目&背包问题)】用Python3刷《代码随想录》
数据结构·python·算法·动态规划
云姜.10 小时前
JSON Schema使用
python·json
Sunshine for you10 小时前
使用Flask快速搭建轻量级Web应用
jvm·数据库·python