学的时候我以为我懂了,遇到问题的时候我发现,其实我没懂,请看示例:
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_name
和 test3.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))