I want to create a class inheriting from a superclass that keeps track of the already initialized class attributes in the superclass. The @property
decorator caught my eye and I tried to implement it (see example below).
class MyClass():
def __init__(self):
self.data="myinitialdata"
class MySubClass(MyClass):
def __init__(self, myclass):
super().__init__()
self._myclass = myclass
@property
def data(self):
return self._myclass.data
def main():
new_myclass = MyClass()
new_myclass.data="mynewdata"
new_mysubclass = MySubClass(new_myclass)
print(new_mysubclass.data)
if __name__=='__main__':
main()
However, if I want to create a property of an already initialized attribute (in the superclass) I always receive an error that the attribute cannot be set:
AttributeError: can't set attribute 'data'
The code example works if I do not initialize data
in MyClass
:
class MyClass():
def __init__(self):
# self.data="myinitialdata"
pass
class MySubClass(MyClass):
def __init__(self, myclass):
super().__init__()
self._myclass = myclass
@property
def data(self):
return self._myclass.data
def main():
new_myclass = MyClass()
new_myclass.data="mynewdata"
new_mysubclass = MySubClass(new_myclass)
print(new_mysubclass.data)
if __name__=='__main__':
main()
Output:
mynewdata
Am I misusing the @property
decorator here or am I missing something else in my implementation? Is the @property
decorator meant to be used in that kind of scenario?
I am currently using Python 3.10.9