Хорошая вещь с наследованием состоит в том, что, как только вы определили @property
(и .setter
) с тем же именем, что и атрибут родителя, __init__
родителя уже будет вызывать этот установщик @property
! (или, если у него нет установщика, AttributeError
будет повышен)
Так что в основном все, что вам нужно сделать, это установить внутреннее имя для атрибута Child
:
class Child(Base):
@property
def var(self):
return self._var
@var.setter
def var(self, value):
self._var = value
Теперь мы можем использовать следующий код для отслеживания выполнения:
class Base:
def __init__(self):
print("In Base's __init__ - setting `var` with 'default'")
self.var = "default"
class Child(Base):
@property
def var(self):
print("In Child's `var` @property getter - getting `_var`")
return self._var
@var.setter
def var(self, value):
print(f"In Child's `var` setter - setting `_var` with {value}")
if isinstance(value, int):
raise TypeError("Can't set var to an int!")
self._var = value
c = Child()
print("-")
print(f"c.__dict__ - {c.__dict__}")
print("-")
print(f"c.var - {c.var}")
print("-")
c.var = "new"
print("-")
print(f"new c.var - {c.var}")
print("-")
c.var = 3
И результат будет:
In Base's __init__ - setting `var` with 'default'
In Child's `var` setter - setting `_var` with default
-
c.__dict__ - {'_var': 'default'}
-
In Child's `var` @property getter - getting `_var`
c.var - default
-
In Child's `var` setter - setting `_var` with new
-
In Child's `var` @property getter - getting `_var`
new c.var - new
-
In Child's `var` setter - setting `_var` with 3
Traceback (most recent call last):
File "C:/Users/tomer/Desktop/python/tests.py", line 29, in <module>
c.var = 3
File "C:/Users/tomer/Desktop/python/tests.py", line 16, in var
raise TypeError("Can't set var to an int!")
TypeError: Can't set var to an int!