I have a global configuration pp
that changes at runtime and needs it to be shared across all parent/child objects.
class Config:
pp = 'Init'
def __init__(self):
pass
class Child(Config):
def __init__(self, name):
self.cc = name
par = Config()
print(f"Parent: {par.pp}")
par.pp = "123"
print(f"Parent: {par.pp}")
child = Child('XYZ')
print(f"Child-1: {child.pp} - {child.cc}")
This prints:
Parent: Init
Parent: 123
Child-1: Init - XYZ
The third line is expected to be Child-1: 123 - XYZ
How can I implement that in a clean way?
UPDATE*
Currently it works with a method like:
class Config:
pp = 'Init'
def __init__(self):
pass
def set_pp(self, val):
type(self).pp = val
>Solution :
In your example, the parent of Child
is not par
(which is an instance of Config
, but it is the class Config
. So you could change the value directly on the class, like that:
class Config:
pp = 'Init'
def __init__(self):
pass
class Child(Config):
def __init__(self, name):
self.cc = name
print(f"Parent: {Config.pp}")
Config.pp = "123"
print(f"Parent: {Config.pp}")
child = Child('XYZ')
print(f"Child-1: {child.pp} - {child.cc}")
Note that if you want to keep the same syntax, you could write
class Config:
_pp = "Init"
@property
def pp(self):
return self._pp
@pp.setter
def pp(self, value):
self.__class__._pp = value
def __init__(self):
pass
class Child(Config):
def __init__(self, name):
self.cc = name
par = Config()
print(f"Parent: {par.pp}")
par.pp = "123"
print(f"Parent: {par.pp}")
child = Child('XYZ')
print(f"Child-1: {child.pp} - {child.cc}")
In this version, the pp
is set from the parent
object, to the class Config
.